Compare commits

..

1 Commits

7 changed files with 57 additions and 105 deletions

19
package-lock.json generated
View File

@@ -9,7 +9,7 @@
"version": "1.0.0",
"dependencies": {
"@azure/arm-cosmosdb": "9.1.0",
"@azure/cosmos": "3.17.4-beta.1",
"@azure/cosmos": "3.16.2",
"@azure/cosmos-language-service": "0.0.5",
"@azure/identity": "1.2.1",
"@azure/ms-rest-nodeauth": "3.0.7",
@@ -396,12 +396,10 @@
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
},
"node_modules/@azure/cosmos": {
"version": "3.17.4-beta.1",
"resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/@azure/cosmos/-/cosmos-3.17.4-beta.1.tgz",
"integrity": "sha1-axE6QafE98LT4IOEeug1NB2hC74=",
"license": "MIT",
"version": "3.16.2",
"resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.16.2.tgz",
"integrity": "sha512-sceY5LWj0BHGj8PSyaVCfDRQLVZyoCfIY78kyIROJVEw0k+p9XFs8fhpykN8JklkCftL0WlaVY+X25SQwnhZsw==",
"dependencies": {
"@azure/abort-controller": "^1.0.0",
"@azure/core-auth": "^1.3.0",
"@azure/core-rest-pipeline": "^1.2.0",
"@azure/core-tracing": "^1.0.0",
@@ -416,7 +414,7 @@
"uuid": "^8.3.0"
},
"engines": {
"node": ">=14.0.0"
"node": ">=12.0.0"
}
},
"node_modules/@azure/cosmos-language-service": {
@@ -31472,11 +31470,10 @@
}
},
"@azure/cosmos": {
"version": "3.17.4-beta.1",
"resolved": "https://msazure.pkgs.visualstudio.com/_packaging/AzurePortal/npm/registry/@azure/cosmos/-/cosmos-3.17.4-beta.1.tgz",
"integrity": "sha1-axE6QafE98LT4IOEeug1NB2hC74=",
"version": "3.16.2",
"resolved": "https://registry.npmjs.org/@azure/cosmos/-/cosmos-3.16.2.tgz",
"integrity": "sha512-sceY5LWj0BHGj8PSyaVCfDRQLVZyoCfIY78kyIROJVEw0k+p9XFs8fhpykN8JklkCftL0WlaVY+X25SQwnhZsw==",
"requires": {
"@azure/abort-controller": "^1.0.0",
"@azure/core-auth": "^1.3.0",
"@azure/core-rest-pipeline": "^1.2.0",
"@azure/core-tracing": "^1.0.0",

View File

@@ -5,7 +5,7 @@
"main": "index.js",
"dependencies": {
"@azure/arm-cosmosdb": "9.1.0",
"@azure/cosmos": "3.17.4-beta.1",
"@azure/cosmos": "3.16.2",
"@azure/cosmos-language-service": "0.0.5",
"@azure/identity": "1.2.1",
"@azure/ms-rest-nodeauth": "3.0.7",

View File

@@ -7,7 +7,6 @@ interface QueryResponse {
hasMoreResults: boolean;
activityId: string;
requestCharge: number;
indexMetrics: string;
}
export interface MinimalQueryIterator {
@@ -31,7 +30,6 @@ export function nextPage(documentsIterator: MinimalQueryIterator, firstItemIndex
headers,
activityId: response.activityId,
requestCharge: response.requestCharge,
indexMetrics: response.indexMetrics,
};
});
}

View File

@@ -45,7 +45,6 @@ export interface QueryResults extends QueryResultsMetadata {
roundTrips?: number;
headers?: any;
queryMetrics?: QueryMetrics;
indexMetrics?: string;
}
export interface Button {

View File

@@ -1,3 +1,4 @@
import { QueryCopilotSampleContainerId, QueryCopilotSampleDatabaseId } from "Common/Constants";
import React from "react";
import AddCollectionIcon from "../../images/AddCollection.svg";
import AddSqlQueryIcon from "../../images/AddSqlQuery_16x16.svg";
@@ -61,6 +62,13 @@ export const createDatabaseContextMenu = (container: Explorer, databaseId: strin
return items;
};
const isQueryCopilotMoreMenu = (selectedCollection: ViewModels.Collection): boolean => {
return (
selectedCollection.databaseId === QueryCopilotSampleDatabaseId &&
selectedCollection.id() === QueryCopilotSampleContainerId
);
};
export const createCollectionContextMenuButton = (
container: Explorer,
selectedCollection: ViewModels.Collection
@@ -95,48 +103,49 @@ export const createCollectionContextMenuButton = (
});
}
if (userContext.apiType === "SQL" || userContext.apiType === "Gremlin") {
items.push({
iconSrc: AddStoredProcedureIcon,
onClick: () => {
const selectedCollection: ViewModels.Collection = useSelectedNode.getState().findSelectedCollection();
selectedCollection && selectedCollection.onNewStoredProcedureClick(selectedCollection, undefined);
},
label: "New Stored Procedure",
});
if (!isQueryCopilotMoreMenu(selectedCollection)) {
if (userContext.apiType === "SQL" || userContext.apiType === "Gremlin") {
items.push({
iconSrc: AddStoredProcedureIcon,
onClick: () => {
const selectedCollection: ViewModels.Collection = useSelectedNode.getState().findSelectedCollection();
selectedCollection && selectedCollection.onNewStoredProcedureClick(selectedCollection, undefined);
},
label: "New Stored Procedure",
});
items.push({
iconSrc: AddUdfIcon,
onClick: () => {
const selectedCollection: ViewModels.Collection = useSelectedNode.getState().findSelectedCollection();
selectedCollection && selectedCollection.onNewUserDefinedFunctionClick(selectedCollection);
},
label: "New UDF",
});
items.push({
iconSrc: AddTriggerIcon,
onClick: () => {
const selectedCollection: ViewModels.Collection = useSelectedNode.getState().findSelectedCollection();
selectedCollection && selectedCollection.onNewTriggerClick(selectedCollection, undefined);
},
label: "New Trigger",
});
}
items.push({
iconSrc: AddUdfIcon,
onClick: () => {
const selectedCollection: ViewModels.Collection = useSelectedNode.getState().findSelectedCollection();
selectedCollection && selectedCollection.onNewUserDefinedFunctionClick(selectedCollection);
},
label: "New UDF",
});
items.push({
iconSrc: AddTriggerIcon,
onClick: () => {
const selectedCollection: ViewModels.Collection = useSelectedNode.getState().findSelectedCollection();
selectedCollection && selectedCollection.onNewTriggerClick(selectedCollection, undefined);
},
label: "New Trigger",
iconSrc: DeleteCollectionIcon,
onClick: () =>
useSidePanel
.getState()
.openSidePanel(
"Delete " + getCollectionName(),
<DeleteCollectionConfirmationPane refreshDatabases={() => container.refreshAllDatabases()} />
),
label: `Delete ${getCollectionName()}`,
styleClass: "deleteCollectionMenuItem",
});
}
items.push({
iconSrc: DeleteCollectionIcon,
onClick: () =>
useSidePanel
.getState()
.openSidePanel(
"Delete " + getCollectionName(),
<DeleteCollectionConfirmationPane refreshDatabases={() => container.refreshAllDatabases()} />
),
label: `Delete ${getCollectionName()}`,
styleClass: "deleteCollectionMenuItem",
});
return items;
};

View File

@@ -1,46 +0,0 @@
import {
Checkbox,
CheckboxVisibility,
DetailsHeader,
DetailsList,
IDetailsHeaderProps,
IDetailsListCheckboxProps,
IRenderFunction,
Stack,
Text
} from "@fluentui/react";
import React from "react";
interface IndexAdvisorComponentProps { };
export const IndexAdvisorComponent: React.FC = (): JSX.Element => {
const onRenderCheckbox = (props: IDetailsListCheckboxProps, _defaultRender?: IRenderFunction<IDetailsListCheckboxProps>) => {
return <Checkbox {...props} />;
};
const onRenderDetailsHeader = (props: IDetailsHeaderProps, _defaultRender?: IRenderFunction<IDetailsHeaderProps>) => {
return <DetailsHeader {...props} ariaLabelForSelectAllCheckbox="Select all" />;
};
return (
<Stack>
<Text>
Here is an analysis on the indexes utilized for executing this query.
Based on the analysis, Cosmos DB recommends adding the selected index(es) to your indexing policy to
optimize your query performance.
</Text>
<Text>Indexes analysis</Text>
<DetailsList
items={[]}
groups={[]}
columns={[]}
onRenderCheckbox={onRenderCheckbox}
checkboxVisibility={CheckboxVisibility.always}
onRenderDetailsHeader={onRenderDetailsHeader}
groupProps={{
showEmptyGroups: true,
}}/>
</Stack>
);
};

View File

@@ -195,10 +195,7 @@ export default class QueryTabComponent extends React.Component<IQueryTabComponen
this.props.collection.databaseId,
this.props.collection.id(),
this.state.selectedContent || this.state.sqlQueryEditorContent,
{
enableCrossPartitionQuery: HeadersUtility.shouldEnableCrossPartitionKey(),
populateIndexMetrics: userContext.apiType === "SQL",
} as FeedOptions
{ enableCrossPartitionQuery: HeadersUtility.shouldEnableCrossPartitionKey() } as FeedOptions
);
}
@@ -219,12 +216,10 @@ export default class QueryTabComponent extends React.Component<IQueryTabComponen
});
try {
//CTODO: Add index metrics to the following method?
const queryResults: ViewModels.QueryResults = await QueryUtils.queryPagesUntilContentPresent(
firstItemIndex,
queryDocuments
);
console.log("Index Metrics: " + queryResults.indexMetrics);
this.setState({ queryResults, error: "" });
} catch (error) {
this.props.tabsBaseInstance.isExecutionError(true);