@firebase/firestore 3.4.8 → 3.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/firestore/lite/index.d.ts +1 -0
  3. package/dist/firestore/src/api/transaction.d.ts +2 -1
  4. package/dist/firestore/src/api/transaction_options.d.ts +17 -0
  5. package/dist/firestore/src/api.d.ts +1 -0
  6. package/dist/firestore/src/core/firestore_client.d.ts +2 -1
  7. package/dist/firestore/src/core/query.d.ts +2 -4
  8. package/dist/firestore/src/core/target.d.ts +6 -4
  9. package/dist/firestore/src/core/transaction_options.d.ts +25 -0
  10. package/dist/firestore/src/core/transaction_runner.d.ts +3 -2
  11. package/dist/firestore/src/lite-api/transaction.d.ts +2 -1
  12. package/dist/firestore/src/lite-api/transaction_options.d.ts +23 -0
  13. package/dist/firestore/src/local/index_manager.d.ts +24 -3
  14. package/dist/firestore/src/local/indexeddb_index_manager.d.ts +4 -7
  15. package/dist/firestore/src/local/indexeddb_schema.d.ts +1 -0
  16. package/dist/firestore/src/local/local_documents_view.d.ts +1 -1
  17. package/dist/firestore/src/local/memory_index_manager.d.ts +3 -2
  18. package/dist/firestore/src/local/query_engine.d.ts +44 -5
  19. package/dist/firestore/src/model/collections.d.ts +1 -1
  20. package/dist/firestore/src/model/values.d.ts +14 -2
  21. package/dist/firestore/src/util/misc.d.ts +3 -0
  22. package/dist/firestore/test/unit/local/counting_query_engine.d.ts +2 -1
  23. package/dist/firestore/test/unit/local/test_index_manager.d.ts +2 -2
  24. package/dist/index.d.ts +24 -1
  25. package/dist/index.esm2017.js +4108 -3992
  26. package/dist/index.esm2017.js.map +1 -1
  27. package/dist/index.esm5.js +4198 -4087
  28. package/dist/index.esm5.js.map +1 -1
  29. package/dist/index.node.cjs.js +1711 -1565
  30. package/dist/index.node.cjs.js.map +1 -1
  31. package/dist/index.node.mjs +1711 -1565
  32. package/dist/index.node.mjs.map +1 -1
  33. package/dist/index.rn.js +4100 -3984
  34. package/dist/index.rn.js.map +1 -1
  35. package/dist/internal.d.ts +50 -4
  36. package/dist/lite/firestore/lite/index.d.ts +1 -0
  37. package/dist/lite/firestore/src/api/transaction.d.ts +2 -1
  38. package/dist/lite/firestore/src/api/transaction_options.d.ts +17 -0
  39. package/dist/lite/firestore/src/api.d.ts +1 -0
  40. package/dist/lite/firestore/src/core/firestore_client.d.ts +2 -1
  41. package/dist/lite/firestore/src/core/query.d.ts +2 -4
  42. package/dist/lite/firestore/src/core/target.d.ts +6 -4
  43. package/dist/lite/firestore/src/core/transaction_options.d.ts +25 -0
  44. package/dist/lite/firestore/src/core/transaction_runner.d.ts +3 -2
  45. package/dist/lite/firestore/src/lite-api/transaction.d.ts +2 -1
  46. package/dist/lite/firestore/src/lite-api/transaction_options.d.ts +23 -0
  47. package/dist/lite/firestore/src/local/index_manager.d.ts +24 -3
  48. package/dist/lite/firestore/src/local/indexeddb_index_manager.d.ts +4 -7
  49. package/dist/lite/firestore/src/local/indexeddb_schema.d.ts +1 -0
  50. package/dist/lite/firestore/src/local/local_documents_view.d.ts +1 -1
  51. package/dist/lite/firestore/src/local/memory_index_manager.d.ts +3 -2
  52. package/dist/lite/firestore/src/local/query_engine.d.ts +44 -5
  53. package/dist/lite/firestore/src/model/collections.d.ts +1 -1
  54. package/dist/lite/firestore/src/model/values.d.ts +14 -2
  55. package/dist/lite/firestore/src/util/misc.d.ts +3 -0
  56. package/dist/lite/firestore/test/unit/local/counting_query_engine.d.ts +2 -1
  57. package/dist/lite/firestore/test/unit/local/test_index_manager.d.ts +2 -2
  58. package/dist/lite/index.browser.esm2017.js +341 -312
  59. package/dist/lite/index.browser.esm2017.js.map +1 -1
  60. package/dist/lite/index.browser.esm5.js +299 -291
  61. package/dist/lite/index.browser.esm5.js.map +1 -1
  62. package/dist/lite/index.d.ts +24 -1
  63. package/dist/lite/index.node.cjs.js +56 -15
  64. package/dist/lite/index.node.cjs.js.map +1 -1
  65. package/dist/lite/index.node.mjs +56 -15
  66. package/dist/lite/index.node.mjs.map +1 -1
  67. package/dist/lite/index.rn.esm2017.js +1227 -1198
  68. package/dist/lite/index.rn.esm2017.js.map +1 -1
  69. package/dist/lite/internal.d.ts +25 -1
  70. package/dist/lite/packages/firestore/dist/lite/index.browser.esm2017.d.ts +28 -28
  71. package/dist/lite/packages/firestore/lite/index.d.ts +1 -0
  72. package/dist/lite/packages/firestore/src/api/transaction.d.ts +2 -1
  73. package/dist/lite/packages/firestore/src/api/transaction_options.d.ts +17 -0
  74. package/dist/lite/packages/firestore/src/api.d.ts +1 -0
  75. package/dist/lite/packages/firestore/src/core/firestore_client.d.ts +2 -1
  76. package/dist/lite/packages/firestore/src/core/query.d.ts +2 -4
  77. package/dist/lite/packages/firestore/src/core/target.d.ts +6 -4
  78. package/dist/lite/packages/firestore/src/core/transaction_options.d.ts +25 -0
  79. package/dist/lite/packages/firestore/src/core/transaction_runner.d.ts +3 -2
  80. package/dist/lite/packages/firestore/src/lite-api/transaction.d.ts +2 -1
  81. package/dist/lite/packages/firestore/src/lite-api/transaction_options.d.ts +23 -0
  82. package/dist/lite/packages/firestore/src/local/index_manager.d.ts +24 -3
  83. package/dist/lite/packages/firestore/src/local/indexeddb_index_manager.d.ts +4 -7
  84. package/dist/lite/packages/firestore/src/local/indexeddb_schema.d.ts +1 -0
  85. package/dist/lite/packages/firestore/src/local/local_documents_view.d.ts +1 -1
  86. package/dist/lite/packages/firestore/src/local/memory_index_manager.d.ts +3 -2
  87. package/dist/lite/packages/firestore/src/local/query_engine.d.ts +44 -5
  88. package/dist/lite/packages/firestore/src/model/collections.d.ts +1 -1
  89. package/dist/lite/packages/firestore/src/model/values.d.ts +14 -2
  90. package/dist/lite/packages/firestore/src/util/misc.d.ts +3 -0
  91. package/dist/lite/packages/firestore/test/unit/local/counting_query_engine.d.ts +2 -1
  92. package/dist/lite/packages/firestore/test/unit/local/test_index_manager.d.ts +2 -2
  93. package/dist/lite/private.d.ts +25 -1
  94. package/dist/packages/firestore/dist/index.esm2017.d.ts +155 -154
  95. package/dist/packages/firestore/lite/index.d.ts +1 -0
  96. package/dist/packages/firestore/src/api/transaction.d.ts +2 -1
  97. package/dist/packages/firestore/src/api/transaction_options.d.ts +17 -0
  98. package/dist/packages/firestore/src/api.d.ts +1 -0
  99. package/dist/packages/firestore/src/core/firestore_client.d.ts +2 -1
  100. package/dist/packages/firestore/src/core/query.d.ts +2 -4
  101. package/dist/packages/firestore/src/core/target.d.ts +6 -4
  102. package/dist/packages/firestore/src/core/transaction_options.d.ts +25 -0
  103. package/dist/packages/firestore/src/core/transaction_runner.d.ts +3 -2
  104. package/dist/packages/firestore/src/lite-api/transaction.d.ts +2 -1
  105. package/dist/packages/firestore/src/lite-api/transaction_options.d.ts +23 -0
  106. package/dist/packages/firestore/src/local/index_manager.d.ts +24 -3
  107. package/dist/packages/firestore/src/local/indexeddb_index_manager.d.ts +4 -7
  108. package/dist/packages/firestore/src/local/indexeddb_schema.d.ts +1 -0
  109. package/dist/packages/firestore/src/local/local_documents_view.d.ts +1 -1
  110. package/dist/packages/firestore/src/local/memory_index_manager.d.ts +3 -2
  111. package/dist/packages/firestore/src/local/query_engine.d.ts +44 -5
  112. package/dist/packages/firestore/src/model/collections.d.ts +1 -1
  113. package/dist/packages/firestore/src/model/values.d.ts +14 -2
  114. package/dist/packages/firestore/src/util/misc.d.ts +3 -0
  115. package/dist/packages/firestore/test/unit/local/counting_query_engine.d.ts +2 -1
  116. package/dist/packages/firestore/test/unit/local/test_index_manager.d.ts +2 -2
  117. package/dist/private.d.ts +50 -4
  118. package/package.json +7 -7
@@ -17,6 +17,7 @@ export { FieldValue } from '../src/lite-api/field_value';
17
17
  export { increment, arrayRemove, arrayUnion, serverTimestamp, deleteField } from '../src/lite-api/field_value_impl';
18
18
  export { FirestoreDataConverter, DocumentSnapshot, QueryDocumentSnapshot, QuerySnapshot, snapshotEqual } from '../src/lite-api/snapshot';
19
19
  export { WriteBatch, writeBatch } from '../src/lite-api/write_batch';
20
+ export { TransactionOptions } from '../src/lite-api/transaction_options';
20
21
  export { Transaction, runTransaction } from '../src/lite-api/transaction';
21
22
  export { setLogLevel, LogLevelString as LogLevel } from '../src/util/log';
22
23
  export { Bytes } from '../src/lite-api/bytes';
@@ -19,6 +19,7 @@ import { DocumentReference } from '../lite-api/reference';
19
19
  import { Transaction as LiteTransaction } from '../lite-api/transaction';
20
20
  import { Firestore } from './database';
21
21
  import { DocumentSnapshot } from './snapshot';
22
+ import { TransactionOptions } from './transaction_options';
22
23
  /**
23
24
  * A reference to a transaction.
24
25
  *
@@ -55,4 +56,4 @@ export declare class Transaction extends LiteTransaction {
55
56
  * `updateFunction `is returned here. Otherwise, if the transaction failed, a
56
57
  * rejected promise with the corresponding failure error is returned.
57
58
  */
58
- export declare function runTransaction<T>(firestore: Firestore, updateFunction: (transaction: Transaction) => Promise<T>): Promise<T>;
59
+ export declare function runTransaction<T>(firestore: Firestore, updateFunction: (transaction: Transaction) => Promise<T>, options?: TransactionOptions): Promise<T>;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ export { TransactionOptions } from '../lite-api/transaction_options';
@@ -22,6 +22,7 @@ export { DocumentChange, DocumentSnapshot, QueryDocumentSnapshot, QuerySnapshot,
22
22
  export { DocumentReference, CollectionReference, Query, doc, collection, collectionGroup, SetOptions, DocumentData, UpdateData, WithFieldValue, PartialWithFieldValue, refEqual, queryEqual } from './api/reference';
23
23
  export { endAt, endBefore, startAt, startAfter, limit, limitToLast, where, orderBy, query, QueryConstraint, QueryConstraintType, OrderByDirection, WhereFilterOp } from './api/filter';
24
24
  export { Unsubscribe, SnapshotListenOptions } from './api/reference_impl';
25
+ export { TransactionOptions } from './api/transaction_options';
25
26
  export { runTransaction, Transaction } from './api/transaction';
26
27
  export { getDoc, getDocFromCache, getDocFromServer, getDocs, getDocsFromCache, getDocsFromServer, onSnapshot, onSnapshotsInSync, setDoc, updateDoc, deleteDoc, addDoc, executeWrite } from './api/reference_impl';
27
28
  export { FieldValue } from './api/field_value';
@@ -30,6 +30,7 @@ import { EventManager, ListenOptions, Observer } from './event_manager';
30
30
  import { Query } from './query';
31
31
  import { SyncEngine } from './sync_engine';
32
32
  import { Transaction } from './transaction';
33
+ import { TransactionOptions } from './transaction_options';
33
34
  import { ViewSnapshot } from './view_snapshot';
34
35
  export declare const MAX_CONCURRENT_LIMBO_RESOLUTIONS = 100;
35
36
  /**
@@ -113,6 +114,6 @@ export declare function firestoreClientAddSnapshotsInSyncListener(client: Firest
113
114
  * been committed. For this reason, it is required that all reads are
114
115
  * performed before any writes. Transactions must be performed while online.
115
116
  */
116
- export declare function firestoreClientTransaction<T>(client: FirestoreClient, updateFunction: (transaction: Transaction) => Promise<T>): Promise<T>;
117
+ export declare function firestoreClientTransaction<T>(client: FirestoreClient, updateFunction: (transaction: Transaction) => Promise<T>, options: TransactionOptions): Promise<T>;
117
118
  export declare function firestoreClientLoadBundle(client: FirestoreClient, databaseId: DatabaseId, data: ReadableStream<Uint8Array> | ArrayBuffer | string, resultTask: LoadBundleTask): void;
118
119
  export declare function firestoreClientGetNamedQuery(client: FirestoreClient, queryName: string): Promise<NamedQuery | undefined>;
@@ -76,9 +76,7 @@ export declare function asCollectionQueryAtPath(query: Query, path: ResourcePath
76
76
  * Returns true if this query does not specify any query constraints that
77
77
  * could remove results.
78
78
  */
79
- export declare function matchesAllDocuments(query: Query): boolean;
80
- export declare function hasLimitToFirst(query: Query): boolean;
81
- export declare function hasLimitToLast(query: Query): boolean;
79
+ export declare function queryMatchesAllDocuments(query: Query): boolean;
82
80
  export declare function getFirstOrderByField(query: Query): FieldPath | null;
83
81
  export declare function getInequalityFilterField(query: Query): FieldPath | null;
84
82
  /**
@@ -113,7 +111,7 @@ export declare function queryOrderBy(query: Query): OrderBy[];
113
111
  export declare function queryToTarget(query: Query): Target;
114
112
  export declare function queryWithAddedFilter(query: Query, filter: Filter): Query;
115
113
  export declare function queryWithAddedOrderBy(query: Query, orderBy: OrderBy): Query;
116
- export declare function queryWithLimit(query: Query, limit: number, limitType: LimitType): Query;
114
+ export declare function queryWithLimit(query: Query, limit: number | null, limitType: LimitType): Query;
117
115
  export declare function queryWithStartAt(query: Query, bound: Bound): Query;
118
116
  export declare function queryWithEndAt(query: Query, bound: Bound): Query;
119
117
  export declare function queryEquals(left: Query, right: Query): boolean;
@@ -72,16 +72,18 @@ export declare function targetGetArrayValues(target: Target, fieldIndex: FieldIn
72
72
  export declare function targetGetNotInValues(target: Target, fieldIndex: FieldIndex): ProtoValue[] | null;
73
73
  /**
74
74
  * Returns a lower bound of field values that can be used as a starting point to
75
- * scan the index defined by `fieldIndex`. Returns `null` if no lower bound
75
+ * scan the index defined by `fieldIndex`. Returns `MIN_VALUE` if no lower bound
76
76
  * exists.
77
77
  */
78
- export declare function targetGetLowerBound(target: Target, fieldIndex: FieldIndex): Bound | null;
78
+ export declare function targetGetLowerBound(target: Target, fieldIndex: FieldIndex): Bound;
79
79
  /**
80
80
  * Returns an upper bound of field values that can be used as an ending point
81
- * when scanning the index defined by `fieldIndex`. Returns `null` if no
81
+ * when scanning the index defined by `fieldIndex`. Returns `MAX_VALUE` if no
82
82
  * upper bound exists.
83
83
  */
84
- export declare function targetGetUpperBound(target: Target, fieldIndex: FieldIndex): Bound | null;
84
+ export declare function targetGetUpperBound(target: Target, fieldIndex: FieldIndex): Bound;
85
+ /** Returns the number of segments of a perfect index for this target. */
86
+ export declare function targetGetSegmentCount(target: Target): number;
85
87
  export declare abstract class Filter {
86
88
  abstract matches(doc: Document): boolean;
87
89
  }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ export declare const DEFAULT_TRANSACTION_OPTIONS: TransactionOptions;
18
+ /**
19
+ * Options to customize transaction behavior.
20
+ */
21
+ export declare interface TransactionOptions {
22
+ /** Maximum number of attempts to commit, after which transaction fails. Default is 5. */
23
+ readonly maxAttempts: number;
24
+ }
25
+ export declare function validateTransactionOptions(options: TransactionOptions): void;
@@ -18,7 +18,7 @@ import { Datastore } from '../remote/datastore';
18
18
  import { AsyncQueue } from '../util/async_queue';
19
19
  import { Deferred } from '../util/promise';
20
20
  import { Transaction } from './transaction';
21
- export declare const DEFAULT_MAX_ATTEMPTS_COUNT = 5;
21
+ import { TransactionOptions } from './transaction_options';
22
22
  /**
23
23
  * TransactionRunner encapsulates the logic needed to run and retry transactions
24
24
  * with backoff.
@@ -26,11 +26,12 @@ export declare const DEFAULT_MAX_ATTEMPTS_COUNT = 5;
26
26
  export declare class TransactionRunner<T> {
27
27
  private readonly asyncQueue;
28
28
  private readonly datastore;
29
+ private readonly options;
29
30
  private readonly updateFunction;
30
31
  private readonly deferred;
31
32
  private attemptsRemaining;
32
33
  private backoff;
33
- constructor(asyncQueue: AsyncQueue, datastore: Datastore, updateFunction: (transaction: Transaction) => Promise<T>, deferred: Deferred<T>);
34
+ constructor(asyncQueue: AsyncQueue, datastore: Datastore, options: TransactionOptions, updateFunction: (transaction: Transaction) => Promise<T>, deferred: Deferred<T>);
34
35
  /** Runs the transaction and sets the result on deferred. */
35
36
  run(): void;
36
37
  private runWithBackOff;
@@ -19,6 +19,7 @@ import { Firestore } from './database';
19
19
  import { FieldPath } from './field_path';
20
20
  import { DocumentReference, PartialWithFieldValue, SetOptions, UpdateData, WithFieldValue } from './reference';
21
21
  import { DocumentSnapshot } from './snapshot';
22
+ import { TransactionOptions } from './transaction_options';
22
23
  /**
23
24
  * A reference to a transaction.
24
25
  *
@@ -116,4 +117,4 @@ export declare class Transaction {
116
117
  * `updateFunction `is returned here. Otherwise, if the transaction failed, a
117
118
  * rejected promise with the corresponding failure error is returned.
118
119
  */
119
- export declare function runTransaction<T>(firestore: Firestore, updateFunction: (transaction: Transaction) => Promise<T>): Promise<T>;
120
+ export declare function runTransaction<T>(firestore: Firestore, updateFunction: (transaction: Transaction) => Promise<T>, options?: TransactionOptions): Promise<T>;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Options to customize transaction behavior.
19
+ */
20
+ export declare interface TransactionOptions {
21
+ /** Maximum number of attempts to commit, after which transaction fails. Default is 5. */
22
+ readonly maxAttempts?: number;
23
+ }
@@ -21,6 +21,22 @@ import { FieldIndex, IndexOffset } from '../model/field_index';
21
21
  import { ResourcePath } from '../model/path';
22
22
  import { PersistencePromise } from './persistence_promise';
23
23
  import { PersistenceTransaction } from './persistence_transaction';
24
+ /** Represents the index state as it relates to a particular target. */
25
+ export declare const enum IndexType {
26
+ /** Indicates that no index could be found for serving the target. */
27
+ NONE = 0,
28
+ /**
29
+ * Indicates that only a "partial index" could be found for serving the
30
+ * target. A partial index is one which does not have a segment for every
31
+ * filter/orderBy in the target.
32
+ */
33
+ PARTIAL = 1,
34
+ /**
35
+ * Indicates that a "full index" could be found for serving the target. A full
36
+ * index is one which has a segment for every filter/orderBy in the target.
37
+ */
38
+ FULL = 2
39
+ }
24
40
  /**
25
41
  * Represents a set of indexes that are used to execute queries efficiently.
26
42
  *
@@ -68,10 +84,10 @@ export interface IndexManager {
68
84
  /** Returns all configured field indexes. */
69
85
  getFieldIndexes(transaction: PersistenceTransaction): PersistencePromise<FieldIndex[]>;
70
86
  /**
71
- * Returns an index that can be used to serve the provided target. Returns
72
- * `null` if no index is configured.
87
+ * Returns the type of index (if any) that can be used to serve the given
88
+ * target.
73
89
  */
74
- getFieldIndex(transaction: PersistenceTransaction, target: Target): PersistencePromise<FieldIndex | null>;
90
+ getIndexType(transaction: PersistenceTransaction, target: Target): PersistencePromise<IndexType>;
75
91
  /**
76
92
  * Returns the documents that match the given target based on the provided
77
93
  * index or `null` if the target does not have a matching index.
@@ -93,4 +109,9 @@ export interface IndexManager {
93
109
  updateCollectionGroup(transaction: PersistenceTransaction, collectionGroup: string, offset: IndexOffset): PersistencePromise<void>;
94
110
  /** Updates the index entries for the provided documents. */
95
111
  updateIndexEntries(transaction: PersistenceTransaction, documents: DocumentMap): PersistencePromise<void>;
112
+ /**
113
+ * Iterates over all field indexes that are used to serve the given target,
114
+ * and returns the minimum offset of them all.
115
+ */
116
+ getMinOffset(transaction: PersistenceTransaction, target: Target): PersistencePromise<IndexOffset>;
96
117
  }
@@ -21,7 +21,7 @@ import { DocumentMap } from '../model/collections';
21
21
  import { DocumentKey } from '../model/document_key';
22
22
  import { FieldIndex, IndexOffset } from '../model/field_index';
23
23
  import { ResourcePath } from '../model/path';
24
- import { IndexManager } from './index_manager';
24
+ import { IndexManager, IndexType } from './index_manager';
25
25
  import { PersistencePromise } from './persistence_promise';
26
26
  import { PersistenceTransaction } from './persistence_transaction';
27
27
  /**
@@ -70,12 +70,8 @@ export declare class IndexedDbIndexManager implements IndexManager {
70
70
  private generateLowerBound;
71
71
  /** Generates the upper bound for `arrayValue` and `directionalValue`. */
72
72
  private generateUpperBound;
73
- /**
74
- * Generates an empty bound that scopes the index scan to the current index
75
- * and user.
76
- */
77
- private generateEmptyBound;
78
- getFieldIndex(transaction: PersistenceTransaction, target: Target): PersistencePromise<FieldIndex | null>;
73
+ private getFieldIndex;
74
+ getIndexType(transaction: PersistenceTransaction, target: Target): PersistencePromise<IndexType>;
79
75
  /**
80
76
  * Returns the byte encoded form of the directional values in the field index.
81
77
  * Returns `null` if the document does not have all fields specified in the
@@ -132,4 +128,5 @@ export declare class IndexedDbIndexManager implements IndexManager {
132
128
  * '[foo > 2 && foo != 3]` becomes `[foo > 2 && < 3, foo > 3]`.
133
129
  */
134
130
  private createRange;
131
+ getMinOffset(transaction: PersistenceTransaction, target: Target): PersistencePromise<IndexOffset>;
135
132
  }
@@ -20,6 +20,7 @@ import { BundledQuery } from '../protos/firestore_bundle_proto';
20
20
  import { Document as ProtoDocument, DocumentsTarget as ProtoDocumentsTarget, QueryTarget as ProtoQueryTarget, Write as ProtoWrite } from '../protos/firestore_proto_api';
21
21
  import { EncodedResourcePath } from './encoded_resource_path';
22
22
  import { DbTimestampKey } from './indexeddb_sentinels';
23
+ export declare const INDEXING_ENABLED = false;
23
24
  export declare const INDEXING_SCHEMA_VERSION = 14;
24
25
  /**
25
26
  * Schema Version for the Web client:
@@ -33,7 +33,7 @@ import { RemoteDocumentCache } from './remote_document_cache';
33
33
  export declare class LocalDocumentsView {
34
34
  readonly remoteDocumentCache: RemoteDocumentCache;
35
35
  readonly mutationQueue: MutationQueue;
36
- readonly indexManager: IndexManager;
36
+ private readonly indexManager;
37
37
  constructor(remoteDocumentCache: RemoteDocumentCache, mutationQueue: MutationQueue, indexManager: IndexManager);
38
38
  /**
39
39
  * Get the local view of the document identified by `key`.
@@ -19,7 +19,7 @@ import { DocumentMap } from '../model/collections';
19
19
  import { DocumentKey } from '../model/document_key';
20
20
  import { FieldIndex, IndexOffset } from '../model/field_index';
21
21
  import { ResourcePath } from '../model/path';
22
- import { IndexManager } from './index_manager';
22
+ import { IndexManager, IndexType } from './index_manager';
23
23
  import { PersistencePromise } from './persistence_promise';
24
24
  import { PersistenceTransaction } from './persistence_transaction';
25
25
  /**
@@ -32,9 +32,10 @@ export declare class MemoryIndexManager implements IndexManager {
32
32
  addFieldIndex(transaction: PersistenceTransaction, index: FieldIndex): PersistencePromise<void>;
33
33
  deleteFieldIndex(transaction: PersistenceTransaction, index: FieldIndex): PersistencePromise<void>;
34
34
  getDocumentsMatchingTarget(transaction: PersistenceTransaction, target: Target): PersistencePromise<DocumentKey[] | null>;
35
- getFieldIndex(transaction: PersistenceTransaction, target: Target): PersistencePromise<FieldIndex | null>;
35
+ getIndexType(transaction: PersistenceTransaction, target: Target): PersistencePromise<IndexType>;
36
36
  getFieldIndexes(transaction: PersistenceTransaction, collectionGroup?: string): PersistencePromise<FieldIndex[]>;
37
37
  getNextCollectionGroupToUpdate(transaction: PersistenceTransaction): PersistencePromise<string | null>;
38
+ getMinOffset(transaction: PersistenceTransaction, target: Target): PersistencePromise<IndexOffset>;
38
39
  updateCollectionGroup(transaction: PersistenceTransaction, collectionGroup: string, offset: IndexOffset): PersistencePromise<void>;
39
40
  updateIndexEntries(transaction: PersistenceTransaction, documents: DocumentMap): PersistencePromise<void>;
40
41
  }
@@ -17,14 +17,35 @@
17
17
  import { Query } from '../core/query';
18
18
  import { SnapshotVersion } from '../core/snapshot_version';
19
19
  import { DocumentKeySet, DocumentMap } from '../model/collections';
20
+ import { IndexManager } from './index_manager';
20
21
  import { LocalDocumentsView } from './local_documents_view';
21
22
  import { PersistencePromise } from './persistence_promise';
22
23
  import { PersistenceTransaction } from './persistence_transaction';
23
24
  /**
24
- * A query engine that takes advantage of the target document mapping in the
25
- * QueryCache. Query execution is optimized by only reading the documents that
26
- * previously matched a query plus any documents that were edited after the
27
- * query was last listened to.
25
+ * The Firestore query engine.
26
+ *
27
+ * Firestore queries can be executed in three modes. The Query Engine determines
28
+ * what mode to use based on what data is persisted. The mode only determines
29
+ * the runtime complexity of the query - the result set is equivalent across all
30
+ * implementations.
31
+ *
32
+ * The Query engine will use indexed-based execution if a user has configured
33
+ * any index that can be used to execute query (via `setIndexConfiguration()`).
34
+ * Otherwise, the engine will try to optimize the query by re-using a previously
35
+ * persisted query result. If that is not possible, the query will be executed
36
+ * via a full collection scan.
37
+ *
38
+ * Index-based execution is the default when available. The query engine
39
+ * supports partial indexed execution and merges the result from the index
40
+ * lookup with documents that have not yet been indexed. The index evaluation
41
+ * matches the backend's format and as such, the SDK can use indexing for all
42
+ * queries that the backend supports.
43
+ *
44
+ * If no index exists, the query engine tries to take advantage of the target
45
+ * document mapping in the TargetCache. These mappings exists for all queries
46
+ * that have been synced with the backend at least once and allow the query
47
+ * engine to only read documents that previously matched a query plus any
48
+ * documents that were edited after the query was last listened to.
28
49
  *
29
50
  * There are some cases when this optimization is not guaranteed to produce
30
51
  * the same results as full collection scans. In these cases, query
@@ -40,16 +61,29 @@ import { PersistenceTransaction } from './persistence_transaction';
40
61
  */
41
62
  export declare class QueryEngine {
42
63
  private localDocumentsView;
64
+ private indexManager;
65
+ private initialized;
43
66
  /** Sets the document view to query against. */
44
- setLocalDocumentsView(localDocuments: LocalDocumentsView): void;
67
+ initialize(localDocuments: LocalDocumentsView, indexManager: IndexManager): void;
45
68
  /** Returns all local documents matching the specified query. */
46
69
  getDocumentsMatchingQuery(transaction: PersistenceTransaction, query: Query, lastLimboFreeSnapshotVersion: SnapshotVersion, remoteKeys: DocumentKeySet): PersistencePromise<DocumentMap>;
70
+ /**
71
+ * Performs an indexed query that evaluates the query based on a collection's
72
+ * persisted index values. Returns `null` if an index is not available.
73
+ */
74
+ private performQueryUsingIndex;
75
+ /**
76
+ * Performs a query based on the target's persisted query mapping. Returns
77
+ * `null` if the mapping is not available or cannot be used.
78
+ */
79
+ private performQueryUsingRemoteKeys;
47
80
  /** Applies the query filter and sorting to the provided documents. */
48
81
  private applyQuery;
49
82
  /**
50
83
  * Determines if a limit query needs to be refilled from cache, making it
51
84
  * ineligible for index-free execution.
52
85
  *
86
+ * @param query The query.
53
87
  * @param sortedPreviousResults - The documents that matched the query when it
54
88
  * was last synchronized, sorted by the query's comparator.
55
89
  * @param remoteKeys - The document keys that matched the query at the last
@@ -59,4 +93,9 @@ export declare class QueryEngine {
59
93
  */
60
94
  private needsRefill;
61
95
  private executeFullCollectionScan;
96
+ /**
97
+ * Combines the results from an indexed execution with the remaining documents
98
+ * that have not yet been indexed.
99
+ */
100
+ private appendRemainingResults;
62
101
  }
@@ -31,7 +31,7 @@ export interface DocumentSizeEntries {
31
31
  sizeMap: SortedMap<DocumentKey, number>;
32
32
  }
33
33
  export declare type DocumentMap = SortedMap<DocumentKey, Document>;
34
- export declare function documentMap(): DocumentMap;
34
+ export declare function documentMap(...docs: Document[]): DocumentMap;
35
35
  export declare type OverlayMap = ObjectMap<DocumentKey, Overlay>;
36
36
  export declare function newOverlayMap(): OverlayMap;
37
37
  export declare type MutationMap = ObjectMap<DocumentKey, Mutation>;
@@ -81,5 +81,17 @@ export declare function isMaxValue(value: Value): boolean;
81
81
  export declare function valuesGetLowerBound(value: Value): Value;
82
82
  /** Returns the largest value for the given value type (exclusive). */
83
83
  export declare function valuesGetUpperBound(value: Value): Value;
84
- export declare function valuesMax(left: Value | undefined, right: Value | undefined): Value | undefined;
85
- export declare function valuesMin(left: Value | undefined, right: Value | undefined): Value | undefined;
84
+ export declare function lowerBoundCompare(left: {
85
+ value: Value;
86
+ inclusive: boolean;
87
+ }, right: {
88
+ value: Value;
89
+ inclusive: boolean;
90
+ }): number;
91
+ export declare function upperBoundCompare(left: {
92
+ value: Value;
93
+ inclusive: boolean;
94
+ }, right: {
95
+ value: Value;
96
+ inclusive: boolean;
97
+ }): number;
@@ -25,6 +25,9 @@ export declare function primitiveComparator<T>(left: T, right: T): number;
25
25
  export interface Equatable<T> {
26
26
  isEqual(other: T): boolean;
27
27
  }
28
+ export interface Iterable<V> {
29
+ forEach: (cb: (v: V) => void) => void;
30
+ }
28
31
  /** Helper to compare arrays using isEqual(). */
29
32
  export declare function arrayEquals<T>(left: T[], right: T[], comparator: (l: T, r: T) => boolean): boolean;
30
33
  /**
@@ -16,6 +16,7 @@
16
16
  */
17
17
  import { Query } from '../../../src/core/query';
18
18
  import { SnapshotVersion } from '../../../src/core/snapshot_version';
19
+ import { IndexManager } from '../../../src/local/index_manager';
19
20
  import { LocalDocumentsView } from '../../../src/local/local_documents_view';
20
21
  import { PersistencePromise } from '../../../src/local/persistence_promise';
21
22
  import { PersistenceTransaction } from '../../../src/local/persistence_transaction';
@@ -51,7 +52,7 @@ export declare class CountingQueryEngine extends QueryEngine {
51
52
  documentsReadByKey: number;
52
53
  resetCounts(): void;
53
54
  getDocumentsMatchingQuery(transaction: PersistenceTransaction, query: Query, lastLimboFreeSnapshotVersion: SnapshotVersion, remoteKeys: DocumentKeySet): PersistencePromise<DocumentMap>;
54
- setLocalDocumentsView(localDocuments: LocalDocumentsView): void;
55
+ initialize(localDocuments: LocalDocumentsView, indexManager: IndexManager): void;
55
56
  private wrapRemoteDocumentCache;
56
57
  private wrapMutationQueue;
57
58
  }
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  import { Target } from '../../../src/core/target';
18
- import { IndexManager } from '../../../src/local/index_manager';
18
+ import { IndexManager, IndexType } from '../../../src/local/index_manager';
19
19
  import { Persistence } from '../../../src/local/persistence';
20
20
  import { DocumentMap } from '../../../src/model/collections';
21
21
  import { DocumentKey } from '../../../src/model/document_key';
@@ -34,7 +34,7 @@ export declare class TestIndexManager {
34
34
  addFieldIndex(index: FieldIndex): Promise<void>;
35
35
  deleteFieldIndex(index: FieldIndex): Promise<void>;
36
36
  getFieldIndexes(collectionGroup?: string): Promise<FieldIndex[]>;
37
- getFieldIndex(target: Target): Promise<FieldIndex | null>;
37
+ getIndexType(target: Target): Promise<IndexType>;
38
38
  getDocumentsMatchingTarget(target: Target): Promise<DocumentKey[] | null>;
39
39
  getNextCollectionGroupToUpdate(): Promise<string | null>;
40
40
  updateCollectionGroup(collectionGroup: string, offset: IndexOffset): Promise<void>;
package/dist/private.d.ts CHANGED
@@ -2303,10 +2303,10 @@ declare interface IndexManager {
2303
2303
  /** Returns all configured field indexes. */
2304
2304
  getFieldIndexes(transaction: PersistenceTransaction): PersistencePromise<FieldIndex[]>;
2305
2305
  /**
2306
- * Returns an index that can be used to serve the provided target. Returns
2307
- * `null` if no index is configured.
2306
+ * Returns the type of index (if any) that can be used to serve the given
2307
+ * target.
2308
2308
  */
2309
- getFieldIndex(transaction: PersistenceTransaction, target: Target): PersistencePromise<FieldIndex | null>;
2309
+ getIndexType(transaction: PersistenceTransaction, target: Target): PersistencePromise<IndexType>;
2310
2310
  /**
2311
2311
  * Returns the documents that match the given target based on the provided
2312
2312
  * index or `null` if the target does not have a matching index.
@@ -2328,6 +2328,11 @@ declare interface IndexManager {
2328
2328
  updateCollectionGroup(transaction: PersistenceTransaction, collectionGroup: string, offset: IndexOffset): PersistencePromise<void>;
2329
2329
  /** Updates the index entries for the provided documents. */
2330
2330
  updateIndexEntries(transaction: PersistenceTransaction, documents: DocumentMap): PersistencePromise<void>;
2331
+ /**
2332
+ * Iterates over all field indexes that are used to serve the given target,
2333
+ * and returns the minimum offset of them all.
2334
+ */
2335
+ getMinOffset(transaction: PersistenceTransaction, target: Target): PersistencePromise<IndexOffset>;
2331
2336
  }
2332
2337
 
2333
2338
  /**
@@ -2400,6 +2405,23 @@ declare class IndexState_2 {
2400
2405
  static empty(): IndexState_2;
2401
2406
  }
2402
2407
 
2408
+ /** Represents the index state as it relates to a particular target. */
2409
+ declare const enum IndexType {
2410
+ /** Indicates that no index could be found for serving the target. */
2411
+ NONE = 0,
2412
+ /**
2413
+ * Indicates that only a "partial index" could be found for serving the
2414
+ * target. A partial index is one which does not have a segment for every
2415
+ * filter/orderBy in the target.
2416
+ */
2417
+ PARTIAL = 1,
2418
+ /**
2419
+ * Indicates that a "full index" could be found for serving the target. A full
2420
+ * index is one which has a segment for every filter/orderBy in the target.
2421
+ */
2422
+ FULL = 2
2423
+ }
2424
+
2403
2425
  /**
2404
2426
  * Initializes a new instance of {@link Firestore} with the provided settings.
2405
2427
  * Can only be called before any other function, including
@@ -4260,7 +4282,7 @@ declare type Resolver<T> = (value?: T) => void;
4260
4282
  * `updateFunction `is returned here. Otherwise, if the transaction failed, a
4261
4283
  * rejected promise with the corresponding failure error is returned.
4262
4284
  */
4263
- export declare function runTransaction<T>(firestore: Firestore, updateFunction: (transaction: Transaction) => Promise<T>): Promise<T>;
4285
+ export declare function runTransaction<T>(firestore: Firestore, updateFunction: (transaction: Transaction) => Promise<T>, options?: TransactionOptions): Promise<T>;
4264
4286
 
4265
4287
  /**
4266
4288
  * Returns a sentinel used with {@link @firebase/firestore/lite#(setDoc:1)} or {@link @firebase/firestore/lite#(updateDoc:1)} to
@@ -5337,6 +5359,30 @@ declare class Transaction_3 {
5337
5359
  private ensureCommitNotCalled;
5338
5360
  }
5339
5361
 
5362
+ /**
5363
+ * @license
5364
+ * Copyright 2022 Google LLC
5365
+ *
5366
+ * Licensed under the Apache License, Version 2.0 (the "License");
5367
+ * you may not use this file except in compliance with the License.
5368
+ * You may obtain a copy of the License at
5369
+ *
5370
+ * http://www.apache.org/licenses/LICENSE-2.0
5371
+ *
5372
+ * Unless required by applicable law or agreed to in writing, software
5373
+ * distributed under the License is distributed on an "AS IS" BASIS,
5374
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5375
+ * See the License for the specific language governing permissions and
5376
+ * limitations under the License.
5377
+ */
5378
+ /**
5379
+ * Options to customize transaction behavior.
5380
+ */
5381
+ export declare interface TransactionOptions {
5382
+ /** Maximum number of attempts to commit, after which transaction fails. Default is 5. */
5383
+ readonly maxAttempts?: number;
5384
+ }
5385
+
5340
5386
  /** Used to represent a field transform on a mutation. */
5341
5387
  declare class TransformOperation {
5342
5388
  private _;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firebase/firestore",
3
- "version": "3.4.8",
3
+ "version": "3.4.9",
4
4
  "engines": {
5
5
  "node": ">=10.10.0"
6
6
  },
@@ -77,9 +77,9 @@
77
77
  "lite/package.json"
78
78
  ],
79
79
  "dependencies": {
80
- "@firebase/component": "0.5.13",
80
+ "@firebase/component": "0.5.14",
81
81
  "@firebase/logger": "0.3.2",
82
- "@firebase/util": "1.5.2",
82
+ "@firebase/util": "1.6.0",
83
83
  "@firebase/webchannel-wrapper": "0.6.1",
84
84
  "@grpc/grpc-js": "^1.3.2",
85
85
  "@grpc/proto-loader": "^0.6.0",
@@ -90,9 +90,9 @@
90
90
  "@firebase/app": "0.x"
91
91
  },
92
92
  "devDependencies": {
93
- "@firebase/app": "0.7.21",
94
- "@firebase/app-compat": "0.1.22",
95
- "@firebase/auth": "0.19.12",
93
+ "@firebase/app": "0.7.23",
94
+ "@firebase/app-compat": "0.1.24",
95
+ "@firebase/auth": "0.20.0",
96
96
  "@rollup/plugin-alias": "3.1.5",
97
97
  "@rollup/plugin-json": "4.1.0",
98
98
  "@types/eslint": "7.28.0",
@@ -106,7 +106,7 @@
106
106
  "rollup-plugin-sourcemaps": "0.6.3",
107
107
  "rollup-plugin-terser": "7.0.2",
108
108
  "rollup-plugin-typescript2": "0.30.0",
109
- "ts-node": "10.2.1",
109
+ "ts-node": "10.7.0",
110
110
  "typescript": "4.2.2"
111
111
  },
112
112
  "repository": {