-
Notifications
You must be signed in to change notification settings - Fork 1k
Fixed an issue with orderless fields in firestore indexes #8913
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
- Fixed ext:export command so that it correctly returns system params in the .env file (#8881) | ||
- Fixed an issue where the MCP server could not successfully use Application Default Credentials. (#8896) | ||
- Fixed an issue where the incorrect API was enabled for `apptesting` commands. | ||
- Fixed an issue where indexes with fields with no order would be handled incorrectly. (#8910) |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,7 +22,7 @@ | |
* Process indexes by filtering out implicit __name__ fields with ASCENDING order. | ||
* Keeps explicit __name__ fields with DESCENDING order. | ||
* @param indexes Array of indexes to process | ||
* @returns Processed array of indexes with filtered fields | ||
*/ | ||
public static processIndexes(indexes: types.Index[]): types.Index[] { | ||
return indexes.map((index: types.Index): types.Index => { | ||
|
@@ -31,7 +31,10 @@ | |
let fields = index.fields; | ||
const lastField = index.fields?.[index.fields.length - 1]; | ||
if (lastField?.fieldPath === "__name__") { | ||
const defaultDirection = index.fields?.[index.fields.length - 2]?.order; | ||
const lastOrderedField = [...fields] | ||
.reverse() | ||
.find((f) => f.fieldPath !== "__name__" && f.order); | ||
const defaultDirection = lastOrderedField?.order; | ||
if (lastField?.order === defaultDirection) { | ||
fields = fields.slice(0, -1); | ||
} | ||
|
@@ -45,7 +48,7 @@ | |
|
||
/** | ||
* Deploy an index specification to the specified project. | ||
* @param options the CLI options. | ||
Check warning on line 51 in src/firestore/api.ts
|
||
* @param indexes an array of objects, each will be validated and then converted | ||
* to an {@link Spec.Index}. | ||
* @param fieldOverrides an array of objects, each will be validated and then | ||
|
@@ -53,11 +56,11 @@ | |
*/ | ||
async deploy( | ||
options: { project: string; nonInteractive: boolean; force: boolean }, | ||
indexes: any[], | ||
fieldOverrides: any[], | ||
databaseId = "(default)", | ||
): Promise<void> { | ||
const spec = this.upgradeOldSpec({ | ||
indexes, | ||
fieldOverrides, | ||
}); | ||
|
@@ -65,8 +68,8 @@ | |
this.validateSpec(spec); | ||
|
||
// Now that the spec is validated we can safely assert these types. | ||
const indexesToDeploy: Spec.Index[] = spec.indexes; | ||
Check warning on line 71 in src/firestore/api.ts
|
||
const fieldOverridesToDeploy: Spec.FieldOverride[] = spec.fieldOverrides; | ||
|
||
const existingIndexes: types.Index[] = await this.listIndexes(options.project, databaseId); | ||
const existingFieldOverrides: types.Field[] = await this.listFieldOverrides( | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While this implementation is correct, it can be made more efficient by avoiding the creation of a new reversed array for each index. A simple
for
loop iterating backwards would be more performant and avoid unnecessary memory allocation, especially for indexes with many fields.