feat: New Fabric sample datasets (#2219)

* add two new fabric sample datasets.

* Update Fabric Home with two sample datasets. One regular and one for vector search.

* Update specs for sample data container

* Add telemetry instead of console log

* Add sampleDataFile to telemetry when importing sample data

---------

Co-authored-by: Mark Brown <mjbrown@microsoft.com>
Co-authored-by: Laurent Nguyen <languye@microsoft.com>
This commit is contained in:
Laurent Nguyen 2025-10-03 17:31:05 +02:00 committed by GitHub
parent 909957a9a1
commit cd27814fad
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 388404 additions and 26 deletions

1
images/AzureOpenAi.svg Normal file
View File

@ -0,0 +1 @@
<svg id="uuid-adbdae8e-5a41-46d1-8c18-aa73cdbfee32" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 18 18"><path d="m0,2.7v12.6c0,1.491,1.209,2.7,2.7,2.7h12.6c1.491,0,2.7-1.209,2.7-2.7V2.7c0-1.491-1.209-2.7-2.7-2.7H2.7C1.209,0,0,1.209,0,2.7ZM10.8,0v3.6c0,3.976,3.224,7.2,7.2,7.2h-3.6c-3.976,0-7.199,3.222-7.2,7.198v-3.598c0-3.976-3.224-7.2-7.2-7.2h3.6c3.976,0,7.2-3.224,7.2-7.2Z" fill="#000000" stroke-width="0" /></svg>

After

Width:  |  Height:  |  Size: 443 B

View File

@ -0,0 +1,3 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 0C8.73438 0 9.44271 0.0960961 10.125 0.288288C10.8073 0.48048 11.4427 0.758091 12.0312 1.12112C12.6198 1.48415 13.1589 1.91124 13.6484 2.4024C14.138 2.89356 14.5573 3.44611 14.9062 4.06006C15.2552 4.67401 15.5234 5.32799 15.7109 6.02202C15.8984 6.71605 15.9948 7.44211 16 8.2002C16 9.08108 15.8698 9.92993 15.6094 10.7467C15.349 11.5636 14.9766 12.3136 14.4922 12.997C14.0078 13.6803 13.4323 14.2783 12.7656 14.7908C12.099 15.3033 11.3542 15.701 10.5312 15.984C10.5156 15.9893 10.4922 15.992 10.4609 15.992C10.4297 15.992 10.4062 15.9947 10.3906 16C10.2656 16 10.1667 15.9626 10.0938 15.8879C10.0208 15.8131 9.98438 15.7144 9.98438 15.5916V14.4705C9.98438 14.1021 9.98698 13.7257 9.99219 13.3413C9.99219 13.0691 9.95312 12.7941 9.875 12.5165C9.79688 12.2389 9.65625 12.0067 9.45312 11.8198C10.0573 11.7504 10.5859 11.625 11.0391 11.4434C11.4922 11.2619 11.8724 11.0057 12.1797 10.6747C12.487 10.3437 12.7161 9.94328 12.8672 9.47347C13.0182 9.00367 13.0964 8.43777 13.1016 7.77578C13.1016 7.35936 13.0339 6.96697 12.8984 6.5986C12.763 6.23023 12.5573 5.88856 12.2812 5.57357C12.3385 5.42409 12.3802 5.26927 12.4062 5.10911C12.4323 4.94895 12.4453 4.78879 12.4453 4.62863C12.4453 4.42042 12.4245 4.21488 12.3828 4.01201C12.3411 3.80914 12.2812 3.60627 12.2031 3.4034C12.1771 3.39273 12.1484 3.38739 12.1172 3.38739C12.0859 3.38739 12.0573 3.38739 12.0312 3.38739C11.8646 3.38739 11.6901 3.41408 11.5078 3.46747C11.3255 3.52085 11.1458 3.59026 10.9688 3.67568C10.7917 3.76109 10.6172 3.85452 10.4453 3.95596C10.2734 4.05739 10.125 4.15349 10 4.24424C9.34896 4.05739 8.68229 3.96396 8 3.96396C7.31771 3.96396 6.65104 4.05739 6 4.24424C5.86979 4.15349 5.72135 4.05739 5.55469 3.95596C5.38802 3.85452 5.21615 3.76376 5.03906 3.68368C4.86198 3.6036 4.67969 3.5342 4.49219 3.47548C4.30469 3.41675 4.13021 3.38739 3.96875 3.38739H3.88281C3.85156 3.38739 3.82292 3.39273 3.79688 3.4034C3.72396 3.60093 3.66667 3.80113 3.625 4.004C3.58333 4.20687 3.5599 4.41508 3.55469 4.62863C3.55469 4.78879 3.56771 4.94895 3.59375 5.10911C3.61979 5.26927 3.66146 5.42409 3.71875 5.57357C3.44271 5.88322 3.23698 6.22222 3.10156 6.59059C2.96615 6.95896 2.89844 7.35402 2.89844 7.77578C2.89844 8.42709 2.97396 8.99032 3.125 9.46547C3.27604 9.94061 3.50521 10.341 3.8125 10.6667C4.11979 10.9923 4.5 11.2513 4.95312 11.4434C5.40625 11.6356 5.9349 11.7638 6.53906 11.8278C6.38802 11.9666 6.27344 12.1321 6.19531 12.3243C6.11719 12.5165 6.0625 12.7167 6.03125 12.9249C5.89062 12.9943 5.74219 13.0477 5.58594 13.0851C5.42969 13.1225 5.27344 13.1411 5.11719 13.1411C4.78385 13.1411 4.50781 13.0611 4.28906 12.9009C4.07031 12.7407 3.875 12.5219 3.70312 12.2442C3.64062 12.1428 3.5651 12.0414 3.47656 11.9399C3.38802 11.8385 3.29167 11.7477 3.1875 11.6677C3.08333 11.5876 2.97135 11.5235 2.85156 11.4755C2.73177 11.4274 2.60677 11.4007 2.47656 11.3954H2.38281C2.34115 11.3954 2.30208 11.4034 2.26562 11.4194C2.22917 11.4354 2.19271 11.4515 2.15625 11.4675C2.11979 11.4835 2.10417 11.5102 2.10938 11.5475C2.10938 11.6116 2.14583 11.673 2.21875 11.7317C2.29167 11.7905 2.35156 11.8385 2.39844 11.8759L2.42188 11.8919C2.53646 11.9826 2.63542 12.0681 2.71875 12.1481C2.80208 12.2282 2.88021 12.3163 2.95312 12.4124C3.02604 12.5085 3.08594 12.6099 3.13281 12.7167C3.17969 12.8235 3.23958 12.9489 3.3125 13.0931C3.48958 13.5095 3.73698 13.8111 4.05469 13.998C4.3724 14.1849 4.75521 14.2809 5.20312 14.2863C5.33854 14.2863 5.47396 14.2783 5.60938 14.2623C5.74479 14.2462 5.88021 14.2222 6.01562 14.1902V15.5836C6.01562 15.7117 5.97917 15.8131 5.90625 15.8879C5.83333 15.9626 5.73177 16 5.60156 16H5.53906C5.51302 16 5.48958 15.9947 5.46875 15.984C4.65104 15.7117 3.90625 15.3193 3.23438 14.8068C2.5625 14.2943 1.98698 13.6937 1.50781 13.005C1.02865 12.3163 0.658854 11.5636 0.398438 10.7467C0.138021 9.92993 0.00520833 9.08108 0 8.2002C0 7.44745 0.09375 6.72139 0.28125 6.02202C0.46875 5.32266 0.739583 4.67134 1.09375 4.06807C1.44792 3.4648 1.86458 2.91225 2.34375 2.41041C2.82292 1.90858 3.36198 1.47881 3.96094 1.12112C4.5599 0.76343 5.19792 0.488488 5.875 0.296296C6.55208 0.104104 7.26042 0.00533867 8 0Z" fill="#000000"/>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -42,7 +42,7 @@ import {
} from "Explorer/Panes/AddCollectionPanel/AddCollectionPanelUtility"; } from "Explorer/Panes/AddCollectionPanel/AddCollectionPanelUtility";
import { useSidePanel } from "hooks/useSidePanel"; import { useSidePanel } from "hooks/useSidePanel";
import { useTeachingBubble } from "hooks/useTeachingBubble"; import { useTeachingBubble } from "hooks/useTeachingBubble";
import { isFabricNative } from "Platform/Fabric/FabricUtil"; import { DEFAULT_FABRIC_NATIVE_CONTAINER_THROUGHPUT, isFabricNative } from "Platform/Fabric/FabricUtil";
import React from "react"; import React from "react";
import { CollectionCreation } from "Shared/Constants"; import { CollectionCreation } from "Shared/Constants";
import { Action } from "Shared/Telemetry/TelemetryConstants"; import { Action } from "Shared/Telemetry/TelemetryConstants";
@ -52,7 +52,6 @@ import { getCollectionName } from "Utils/APITypeUtils";
import { isCapabilityEnabled, isServerlessAccount, isVectorSearchEnabled } from "Utils/CapabilityUtils"; import { isCapabilityEnabled, isServerlessAccount, isVectorSearchEnabled } from "Utils/CapabilityUtils";
import { getUpsellMessage } from "Utils/PricingUtils"; import { getUpsellMessage } from "Utils/PricingUtils";
import { ValidCosmosDbIdDescription, ValidCosmosDbIdInputPattern } from "Utils/ValidationUtils"; import { ValidCosmosDbIdDescription, ValidCosmosDbIdInputPattern } from "Utils/ValidationUtils";
import * as AutoPilotUtils from "../../../Utils/AutoPilotUtils";
import { CollapsibleSectionComponent } from "../../Controls/CollapsiblePanel/CollapsibleSectionComponent"; import { CollapsibleSectionComponent } from "../../Controls/CollapsiblePanel/CollapsibleSectionComponent";
import { ThroughputInput } from "../../Controls/ThroughputInput/ThroughputInput"; import { ThroughputInput } from "../../Controls/ThroughputInput/ThroughputInput";
import { ContainerSampleGenerator } from "../../DataSamples/ContainerSampleGenerator"; import { ContainerSampleGenerator } from "../../DataSamples/ContainerSampleGenerator";
@ -1355,8 +1354,7 @@ export class AddCollectionPanel extends React.Component<AddCollectionPanelProps,
// Throughput // Throughput
if (isFabricNative()) { if (isFabricNative()) {
// Fabric Native accounts are always autoscale and have a fixed throughput of 5K autoPilotMaxThroughput = DEFAULT_FABRIC_NATIVE_CONTAINER_THROUGHPUT;
autoPilotMaxThroughput = AutoPilotUtils.autoPilotThroughput5K;
offerThroughput = undefined; offerThroughput = undefined;
} else if (databaseLevelThroughput) { } else if (databaseLevelThroughput) {
if (this.state.createNewDatabase) { if (this.state.createNewDatabase) {

View File

@ -3,12 +3,15 @@
*/ */
import { Link, makeStyles, tokens } from "@fluentui/react-components"; import { Link, makeStyles, tokens } from "@fluentui/react-components";
import { DocumentAddRegular, LinkMultipleRegular, OpenRegular } from "@fluentui/react-icons"; import { DocumentAddRegular, LinkMultipleRegular, OpenRegular } from "@fluentui/react-icons";
import { SampleDataImportDialog } from "Explorer/SplashScreen/SampleDataImportDialog"; import { SampleDataConfiguration, SampleDataImportDialog } from "Explorer/SplashScreen/SampleDataImportDialog";
import { SampleDataFile } from "Explorer/SplashScreen/SampleUtil";
import { CosmosFluentProvider } from "Explorer/Theme/ThemeUtil"; import { CosmosFluentProvider } from "Explorer/Theme/ThemeUtil";
import { isFabricNative, isFabricNativeReadOnly } from "Platform/Fabric/FabricUtil"; import { isFabricNative, isFabricNativeReadOnly } from "Platform/Fabric/FabricUtil";
import * as React from "react"; import * as React from "react";
import { userContext } from "UserContext"; import { userContext } from "UserContext";
import AzureOpenAiIcon from "../../../images/AzureOpenAi.svg";
import CosmosDbBlackIcon from "../../../images/CosmosDB_black.svg"; import CosmosDbBlackIcon from "../../../images/CosmosDB_black.svg";
import GithubIcon from "../../../images/github-black-and-white.svg";
import Explorer from "../Explorer"; import Explorer from "../Explorer";
export interface SplashScreenProps { export interface SplashScreenProps {
@ -26,11 +29,11 @@ const useStyles = makeStyles({
fontWeight: "bold", fontWeight: "bold",
}, },
buttonsContainer: { buttonsContainer: {
width: "584px", width: "760px",
margin: "auto", margin: "auto",
display: "grid", display: "grid",
padding: "16px", padding: "16px",
gridTemplateColumns: "repeat(3, 1fr)", gridTemplateColumns: "repeat(4, 1fr)",
gap: "10px", gap: "10px",
gridAutoRows: "minmax(184px, auto)", gridAutoRows: "minmax(184px, auto)",
}, },
@ -53,6 +56,15 @@ const useStyles = makeStyles({
}, },
}, },
three: { three: {
gridColumn: "4",
gridRow: "1",
"& img": {
width: "32px",
height: "32px",
margin: "auto",
},
},
four: {
gridColumn: "3", gridColumn: "3",
gridRow: "2", gridRow: "2",
"& svg": { "& svg": {
@ -61,6 +73,15 @@ const useStyles = makeStyles({
margin: "auto", margin: "auto",
}, },
}, },
five: {
gridColumn: "4",
gridRow: "2",
"& img": {
width: "32px",
height: "32px",
margin: "auto",
},
},
single: { single: {
gridColumn: "1 / 4", gridColumn: "1 / 4",
gridRow: "1 / 3", gridRow: "1 / 3",
@ -132,6 +153,8 @@ const FabricHomeScreenButton: React.FC<FabricHomeScreenButtonProps & { className
export const FabricHomeScreen: React.FC<SplashScreenProps> = (props: SplashScreenProps) => { export const FabricHomeScreen: React.FC<SplashScreenProps> = (props: SplashScreenProps) => {
const styles = useStyles(); const styles = useStyles();
const [openSampleDataImportDialog, setOpenSampleDataImportDialog] = React.useState(false); const [openSampleDataImportDialog, setOpenSampleDataImportDialog] = React.useState(false);
const [selectedSampleDataConfiguration, setSelectedSampleDataConfiguration] =
React.useState<SampleDataConfiguration>(undefined);
const getSplashScreenButtons = (): JSX.Element => { const getSplashScreenButtons = (): JSX.Element => {
const buttons: FabricHomeScreenButtonProps[] = [ const buttons: FabricHomeScreenButtonProps[] = [
@ -145,10 +168,30 @@ export const FabricHomeScreen: React.FC<SplashScreenProps> = (props: SplashScree
}, },
}, },
{ {
title: "Sample data", title: "Sample Data",
description: "Automatically load sample data in your database", description: "Load sample data in your database",
icon: <img src={CosmosDbBlackIcon} alt={"Azure Cosmos DB icon"} aria-hidden="true" />, icon: <img src={CosmosDbBlackIcon} alt={"Azure Cosmos DB icon"} aria-hidden="true" />,
onClick: () => setOpenSampleDataImportDialog(true), onClick: () => {
setSelectedSampleDataConfiguration({
databaseName: userContext.fabricContext?.databaseName,
newContainerName: "SampleData",
sampleDataFile: SampleDataFile.FABRIC_SAMPLE_DATA,
});
setOpenSampleDataImportDialog(true);
},
},
{
title: "Sample Vector Data",
description: "Load sample vector data in your database",
icon: <img src={AzureOpenAiIcon} alt={"Azure Open AI icon"} aria-hidden="true" />,
onClick: () => {
setSelectedSampleDataConfiguration({
databaseName: userContext.fabricContext?.databaseName,
newContainerName: "SampleVectorData",
sampleDataFile: SampleDataFile.FABRIC_SAMPLE_VECTOR_DATA,
});
setOpenSampleDataImportDialog(true);
},
}, },
{ {
title: "App development", title: "App development",
@ -156,17 +199,25 @@ export const FabricHomeScreen: React.FC<SplashScreenProps> = (props: SplashScree
icon: <LinkMultipleRegular />, icon: <LinkMultipleRegular />,
onClick: () => window.open("https://aka.ms/cosmosdbfabricsdk", "_blank"), onClick: () => window.open("https://aka.ms/cosmosdbfabricsdk", "_blank"),
}, },
{
title: "Sample Gallery",
description: "Get real-world end-to-end samples",
icon: <img src={GithubIcon} alt={"GitHub icon"} aria-hidden="true" />,
onClick: () => window.open("https://azurecosmosdb.github.io/gallery/?tags=example&tags=analytics", "_blank"),
},
]; ];
return isFabricNativeReadOnly() ? ( return isFabricNativeReadOnly() ? (
<div className={styles.buttonsContainer}> <div className={styles.buttonsContainer}>
<FabricHomeScreenButton className={styles.single} {...buttons[2]} /> <FabricHomeScreenButton className={styles.single} {...buttons[3]} />
</div> </div>
) : ( ) : (
<div className={styles.buttonsContainer}> <div className={styles.buttonsContainer}>
<FabricHomeScreenButton className={styles.one} {...buttons[0]} /> <FabricHomeScreenButton className={styles.one} {...buttons[0]} />
<FabricHomeScreenButton className={styles.two} {...buttons[1]} /> <FabricHomeScreenButton className={styles.two} {...buttons[1]} />
<FabricHomeScreenButton className={styles.three} {...buttons[2]} /> <FabricHomeScreenButton className={styles.three} {...buttons[2]} />
<FabricHomeScreenButton className={styles.four} {...buttons[3]} />
<FabricHomeScreenButton className={styles.five} {...buttons[4]} />
</div> </div>
); );
}; };
@ -179,7 +230,7 @@ export const FabricHomeScreen: React.FC<SplashScreenProps> = (props: SplashScree
open={openSampleDataImportDialog} open={openSampleDataImportDialog}
setOpen={setOpenSampleDataImportDialog} setOpen={setOpenSampleDataImportDialog}
explorer={props.explorer} explorer={props.explorer}
databaseName={userContext.fabricContext?.databaseName} sampleDataConfiguration={selectedSampleDataConfiguration}
/> />
<div className={styles.title} role="heading" aria-label={title} aria-level={1}> <div className={styles.title} role="heading" aria-label={title} aria-level={1}>
{title} {title}

View File

@ -11,12 +11,10 @@ import {
tokens, tokens,
} from "@fluentui/react-components"; } from "@fluentui/react-components";
import Explorer from "Explorer/Explorer"; import Explorer from "Explorer/Explorer";
import { checkContainerExists, createContainer, importData } from "Explorer/SplashScreen/SampleUtil"; import { checkContainerExists, createContainer, importData, SampleDataFile } from "Explorer/SplashScreen/SampleUtil";
import React, { useEffect, useState } from "react"; import React, { useEffect, useState } from "react";
import * as ViewModels from "../../Contracts/ViewModels"; import * as ViewModels from "../../Contracts/ViewModels";
const SAMPLE_DATA_CONTAINER_NAME = "SampleData";
const useStyles = makeStyles({ const useStyles = makeStyles({
dialogContent: { dialogContent: {
alignItems: "center", alignItems: "center",
@ -24,6 +22,12 @@ const useStyles = makeStyles({
}, },
}); });
export interface SampleDataConfiguration {
databaseName: string;
newContainerName: string;
sampleDataFile: SampleDataFile;
}
/** /**
* This dialog: * This dialog:
* - creates a container * - creates a container
@ -35,11 +39,11 @@ export const SampleDataImportDialog: React.FC<{
open: boolean; open: boolean;
setOpen: (open: boolean) => void; setOpen: (open: boolean) => void;
explorer: Explorer; explorer: Explorer;
databaseName: string; sampleDataConfiguration: SampleDataConfiguration | undefined;
}> = (props) => { }> = (props) => {
const [status, setStatus] = useState<"idle" | "creating" | "importing" | "completed" | "error">("idle"); const [status, setStatus] = useState<"idle" | "creating" | "importing" | "completed" | "error">("idle");
const [errorMessage, setErrorMessage] = useState<string | null>(null); const [errorMessage, setErrorMessage] = useState<string | null>(null);
const containerName = SAMPLE_DATA_CONTAINER_NAME; const containerName = props.sampleDataConfiguration?.newContainerName;
const [collection, setCollection] = useState<ViewModels.Collection>(undefined); const [collection, setCollection] = useState<ViewModels.Collection>(undefined);
const styles = useStyles(); const styles = useStyles();
@ -53,7 +57,7 @@ export const SampleDataImportDialog: React.FC<{
const handleStartImport = async (): Promise<void> => { const handleStartImport = async (): Promise<void> => {
setStatus("creating"); setStatus("creating");
const databaseName = props.databaseName; const databaseName = props.sampleDataConfiguration.databaseName;
if (checkContainerExists(databaseName, containerName)) { if (checkContainerExists(databaseName, containerName)) {
const msg = `The container "${containerName}" in database "${databaseName}" already exists. Please delete it and retry.`; const msg = `The container "${containerName}" in database "${databaseName}" already exists. Please delete it and retry.`;
setStatus("error"); setStatus("error");
@ -63,7 +67,12 @@ export const SampleDataImportDialog: React.FC<{
let collection; let collection;
try { try {
collection = await createContainer(databaseName, containerName, props.explorer); collection = await createContainer(
databaseName,
containerName,
props.explorer,
props.sampleDataConfiguration.sampleDataFile,
);
} catch (error) { } catch (error) {
setStatus("error"); setStatus("error");
setErrorMessage(`Failed to create container: ${error instanceof Error ? error.message : String(error)}`); setErrorMessage(`Failed to create container: ${error instanceof Error ? error.message : String(error)}`);
@ -72,7 +81,7 @@ export const SampleDataImportDialog: React.FC<{
try { try {
setStatus("importing"); setStatus("importing");
await importData(collection); await importData(props.sampleDataConfiguration.sampleDataFile, collection);
setCollection(collection); setCollection(collection);
setStatus("completed"); setStatus("completed");
} catch (error) { } catch (error) {

View File

@ -1,9 +1,13 @@
import { JSONObject } from "@azure/cosmos";
import { BackendDefaults } from "Common/Constants"; import { BackendDefaults } from "Common/Constants";
import { createCollection } from "Common/dataAccess/createCollection"; import { createCollection } from "Common/dataAccess/createCollection";
import Explorer from "Explorer/Explorer"; import Explorer from "Explorer/Explorer";
import { useDatabases } from "Explorer/useDatabases"; import { useDatabases } from "Explorer/useDatabases";
import { DEFAULT_FABRIC_NATIVE_CONTAINER_THROUGHPUT, isFabricNative } from "Platform/Fabric/FabricUtil";
import { Action, ActionModifiers } from "Shared/Telemetry/TelemetryConstants";
import * as DataModels from "../../Contracts/DataModels"; import * as DataModels from "../../Contracts/DataModels";
import * as ViewModels from "../../Contracts/ViewModels"; import * as ViewModels from "../../Contracts/ViewModels";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
/** /**
* Public for unit tests * Public for unit tests
@ -26,12 +30,20 @@ const hasContainer = (
export const checkContainerExists = (databaseName: string, containerName: string) => export const checkContainerExists = (databaseName: string, containerName: string) =>
hasContainer(databaseName, containerName, useDatabases.getState().databases); hasContainer(databaseName, containerName, useDatabases.getState().databases);
export enum SampleDataFile {
COPILOT = "Copilot",
FABRIC_SAMPLE_DATA = "FabricSampleData",
FABRIC_SAMPLE_VECTOR_DATA = "FabricSampleVectorData",
}
export const createContainer = async ( export const createContainer = async (
databaseName: string, databaseName: string,
containerName: string, containerName: string,
explorer: Explorer, explorer: Explorer,
sampleDataFile: SampleDataFile,
): Promise<ViewModels.Collection> => { ): Promise<ViewModels.Collection> => {
const createRequest: DataModels.CreateCollectionParams = { const createRequest: DataModels.CreateCollectionParams = {
autoPilotMaxThroughput: isFabricNative() ? DEFAULT_FABRIC_NATIVE_CONTAINER_THROUGHPUT : undefined,
createNewDatabase: false, createNewDatabase: false,
collectionId: containerName, collectionId: containerName,
databaseId: databaseName, databaseId: databaseName,
@ -41,6 +53,44 @@ export const createContainer = async (
kind: "Hash", kind: "Hash",
version: BackendDefaults.partitionKeyVersion, version: BackendDefaults.partitionKeyVersion,
}, },
vectorEmbeddingPolicy:
sampleDataFile === SampleDataFile.FABRIC_SAMPLE_VECTOR_DATA
? {
vectorEmbeddings: [
{
path: "/descriptionVector",
dataType: "float32",
distanceFunction: "cosine",
dimensions: 512,
},
],
}
: undefined,
indexingPolicy:
sampleDataFile === SampleDataFile.FABRIC_SAMPLE_VECTOR_DATA
? {
automatic: true,
indexingMode: "consistent",
includedPaths: [
{
path: "/*",
},
],
excludedPaths: [
{
path: '/"_etag"/?',
},
],
fullTextIndexes: [],
vectorIndexes: [
{
path: "/descriptionVector",
type: "quantizedFlat",
quantizationByteSize: 64,
},
],
}
: undefined,
}; };
await createCollection(createRequest); await createCollection(createRequest);
await explorer.refreshAllDatabases(); await explorer.refreshAllDatabases();
@ -55,10 +105,39 @@ export const createContainer = async (
const SAMPLE_DATA_PARTITION_KEY = "category"; // This pkey is specifically set for queryCopilotSampleData.json below const SAMPLE_DATA_PARTITION_KEY = "category"; // This pkey is specifically set for queryCopilotSampleData.json below
export const importData = async (collection: ViewModels.Collection): Promise<void> => { export const importData = async (sampleDataFile: SampleDataFile, collection: ViewModels.Collection): Promise<void> => {
// TODO: keep same chunk as ContainerSampleGenerator let documents: JSONObject[] = undefined;
const dataFileContent = await import( switch (sampleDataFile) {
/* webpackChunkName: "queryCopilotSampleData" */ "../../../sampleData/queryCopilotSampleData.json" case SampleDataFile.COPILOT:
); documents = (
await collection.bulkInsertDocuments(dataFileContent.data); await import(/* webpackChunkName: "queryCopilotSampleData" */ "../../../sampleData/queryCopilotSampleData.json")
).data;
break;
case SampleDataFile.FABRIC_SAMPLE_DATA:
documents = (await import(/* webpackChunkName: "fabricSampleData" */ "../../../sampleData/fabricSampleData.json"))
.default;
break;
case SampleDataFile.FABRIC_SAMPLE_VECTOR_DATA:
documents = (
await import(
/* webpackChunkName: "fabricSampleDataVectors" */ "../../../sampleData/fabricSampleDataVectors.json"
)
).default;
break;
default:
throw new Error(`Unknown sample data file: ${sampleDataFile}`);
}
if (!documents) {
throw new Error(`Failed to load sample data file: ${sampleDataFile}`);
}
// Time it
const start = performance.now();
await collection.bulkInsertDocuments(documents);
const end = performance.now();
TelemetryProcessor.trace(Action.ImportSampleData, ActionModifiers.Success, {
documentsCount: documents.length,
durationMs: end - start,
sampleDataFile,
});
}; };

View File

@ -4,6 +4,10 @@ import { FabricMessageTypes } from "Contracts/FabricMessageTypes";
import { CosmosDbArtifactType, ResourceTokenInfo } from "Contracts/FabricMessagesContract"; import { CosmosDbArtifactType, ResourceTokenInfo } from "Contracts/FabricMessagesContract";
import { FabricArtifactInfo, updateUserContext, userContext } from "UserContext"; import { FabricArtifactInfo, updateUserContext, userContext } from "UserContext";
import { logConsoleError } from "Utils/NotificationConsoleUtils"; import { logConsoleError } from "Utils/NotificationConsoleUtils";
import * as AutoPilotUtils from "../../Utils/AutoPilotUtils";
// Fabric Native accounts are always autoscale and have a fixed throughput of 5K
export const DEFAULT_FABRIC_NATIVE_CONTAINER_THROUGHPUT = AutoPilotUtils.autoPilotThroughput5K;
const TOKEN_VALIDITY_MS = (3600 - 600) * 1000; // 1 hour minus 10 minutes to be safe const TOKEN_VALIDITY_MS = (3600 - 600) * 1000; // 1 hour minus 10 minutes to be safe
const DEBOUNCE_DELAY_MS = 1000 * 20; // 20 second const DEBOUNCE_DELAY_MS = 1000 * 20; // 20 second

View File

@ -150,6 +150,7 @@ export enum Action {
CloudShellUserConsent, CloudShellUserConsent,
CloudShellTerminalSession, CloudShellTerminalSession,
OpenVSCode, OpenVSCode,
ImportSampleData,
} }
export const ActionModifiers = { export const ActionModifiers = {