Added ignore partition key option (#2227)

* Added ignore partition key option

* fix unit test

* fix unit test

* Fix Unit Test
This commit is contained in:
sunghyunkang1111
2025-10-16 16:45:50 -05:00
committed by GitHub
parent d924824536
commit 3cd6d5a65d
4 changed files with 109 additions and 1 deletions

View File

@@ -1,5 +1,6 @@
import { Item, RequestOptions } from "@azure/cosmos";
import { HttpHeaders } from "Common/Constants";
import { LocalStorageUtility, StorageKey } from "Shared/StorageUtility";
import { CollectionBase } from "../../Contracts/ViewModels";
import DocumentId from "../../Explorer/Tree/DocumentId";
import { logConsoleInfo, logConsoleProgress } from "../../Utils/NotificationConsoleUtils";
@@ -23,10 +24,17 @@ export const updateDocument = async (
[HttpHeaders.partitionKey]: documentId.partitionKeyValue,
}
: {};
// If user has chosen to ignore partition key on update, pass null instead of actual partition key value
const ignorePartitionKeyOnDocumentUpdateFlag = LocalStorageUtility.getEntryBoolean(
StorageKey.IgnorePartitionKeyOnDocumentUpdate,
);
const partitionKey = ignorePartitionKeyOnDocumentUpdateFlag ? undefined : getPartitionKeyValue(documentId);
const response = await client()
.database(collection.databaseId)
.container(collection.id())
.item(documentId.id(), getPartitionKeyValue(documentId))
.item(documentId.id(), partitionKey)
.replace(newDocument, options);
logConsoleInfo(`Successfully updated ${entityName} ${documentId.id()}`);

View File

@@ -204,6 +204,9 @@ export const SettingsPane: FunctionComponent<{ explorer: Explorer }> = ({
? (LocalStorageUtility.getEntryString(StorageKey.MongoGuidRepresentation) as Constants.MongoGuidRepresentation)
: Constants.MongoGuidRepresentation.CSharpLegacy,
);
const [ignorePartitionKeyOnDocumentUpdate, setIgnorePartitionKeyOnDocumentUpdate] = useState<boolean>(
LocalStorageUtility.getEntryBoolean(StorageKey.IgnorePartitionKeyOnDocumentUpdate),
);
const styles = useStyles();
@@ -424,6 +427,12 @@ export const SettingsPane: FunctionComponent<{ explorer: Explorer }> = ({
LocalStorageUtility.setEntryString(StorageKey.MongoGuidRepresentation, mongoGuidRepresentation);
}
// Advanced settings
LocalStorageUtility.setEntryBoolean(
StorageKey.IgnorePartitionKeyOnDocumentUpdate,
ignorePartitionKeyOnDocumentUpdate,
);
setIsExecuting(false);
logConsoleInfo(
`Updated items per page setting to ${LocalStorageUtility.getEntryNumber(StorageKey.ActualItemPerPage)}`,
@@ -453,6 +462,10 @@ export const SettingsPane: FunctionComponent<{ explorer: Explorer }> = ({
);
}
logConsoleInfo(
`${ignorePartitionKeyOnDocumentUpdate ? "Enabled" : "Disabled"} ignoring partition key on document update`,
);
refreshExplorer && (await explorer.refreshExplorer());
closeSidePanel();
};
@@ -593,6 +606,13 @@ export const SettingsPane: FunctionComponent<{ explorer: Explorer }> = ({
setMongoGuidRepresentation(option.key as Constants.MongoGuidRepresentation);
};
const handleOnIgnorePartitionKeyOnDocumentUpdateChange = (
ev: React.MouseEvent<HTMLElement>,
checked?: boolean,
): void => {
setIgnorePartitionKeyOnDocumentUpdate(!!checked);
};
const choiceButtonStyles = {
root: {
clear: "both",
@@ -1137,6 +1157,23 @@ export const SettingsPane: FunctionComponent<{ explorer: Explorer }> = ({
</AccordionPanel>
</AccordionItem>
)}
<AccordionItem value="15">
<AccordionHeader>
<div className={styles.header}>Advanced Settings</div>
</AccordionHeader>
<AccordionPanel>
<div className={styles.settingsSectionContainer}>
<Checkbox
styles={{ label: { padding: 0 } }}
className="padding"
ariaLabel="Ignore partition key on document update"
checked={ignorePartitionKeyOnDocumentUpdate}
onChange={handleOnIgnorePartitionKeyOnDocumentUpdateChange}
label="Ignore partition key on document update"
/>
</div>
</AccordionPanel>
</AccordionItem>
</Accordion>
)}

View File

@@ -575,6 +575,37 @@ exports[`Settings Pane should render Default properly 1`] = `
</div>
</AccordionPanel>
</AccordionItem>
<AccordionItem
value="15"
>
<AccordionHeader>
<div
className="___15c001r_0000000 fq02s40"
>
Advanced Settings
</div>
</AccordionHeader>
<AccordionPanel>
<div
className="___1dfa554_0000000 fo7qwa0"
>
<StyledCheckboxBase
ariaLabel="Ignore partition key on document update"
checked={false}
className="padding"
label="Ignore partition key on document update"
onChange={[Function]}
styles={
{
"label": {
"padding": 0,
},
}
}
/>
</div>
</AccordionPanel>
</AccordionItem>
</Accordion>
<div
className="settingsSection"
@@ -838,6 +869,37 @@ exports[`Settings Pane should render Gremlin properly 1`] = `
</div>
</AccordionPanel>
</AccordionItem>
<AccordionItem
value="15"
>
<AccordionHeader>
<div
className="___15c001r_0000000 fq02s40"
>
Advanced Settings
</div>
</AccordionHeader>
<AccordionPanel>
<div
className="___1dfa554_0000000 fo7qwa0"
>
<StyledCheckboxBase
ariaLabel="Ignore partition key on document update"
checked={false}
className="padding"
label="Ignore partition key on document update"
onChange={[Function]}
styles={
{
"label": {
"padding": 0,
},
}
}
/>
</div>
</AccordionPanel>
</AccordionItem>
</Accordion>
<div
className="settingsSection"

View File

@@ -35,6 +35,7 @@ export enum StorageKey {
DefaultQueryResultsView,
AppState,
MongoGuidRepresentation,
IgnorePartitionKeyOnDocumentUpdate,
}
export const hasRUThresholdBeenConfigured = (): boolean => {