Make various enhancements to Notebook Provider registration. (#17609)

* Use built-in SQL ExecuteProvider by default if no other provider exists.

* Gracefully handle case where standardKernels are not defined for a provider.

* Standardize on just using arrays for various provider registration details.
This commit is contained in:
Cory Rivera
2021-11-09 16:00:34 -08:00
committed by GitHub
parent 8057bf855b
commit 329ea4103c
8 changed files with 83 additions and 126 deletions

View File

@@ -149,7 +149,7 @@ export class NotebookModel extends Disposable implements INotebookModel {
public get serializationManager(): ISerializationManager | undefined {
let manager = this.serializationManagers.find(manager => manager.providerId === this._providerId);
if (!manager) {
manager = this.serializationManagers.find(manager => manager.providerId === DEFAULT_NOTEBOOK_PROVIDER);
manager = this.serializationManagers.find(manager => manager.providerId === SQL_NOTEBOOK_PROVIDER);
}
return manager;
}
@@ -165,9 +165,7 @@ export class NotebookModel extends Disposable implements INotebookModel {
public get executeManager(): IExecuteManager | undefined {
let manager = this.executeManagers.find(manager => manager.providerId === this._providerId);
if (!manager) {
// Note: this seems like a less than ideal scenario. We should ideally pass in the "correct" provider ID and allow there to be a default,
// instead of assuming in the NotebookModel constructor that the option is either SQL or Jupyter
manager = this.executeManagers.find(manager => manager.providerId === DEFAULT_NOTEBOOK_PROVIDER);
manager = this.executeManagers.find(manager => manager.providerId === SQL_NOTEBOOK_PROVIDER);
}
return manager;
}

View File

@@ -5,7 +5,7 @@
import * as path from 'vs/base/common/path';
import { nb, ServerInfo } from 'azdata';
import { DEFAULT_NOTEBOOK_PROVIDER, DEFAULT_NOTEBOOK_FILETYPE, INotebookService } from 'sql/workbench/services/notebook/browser/notebookService';
import { DEFAULT_NOTEBOOK_PROVIDER, DEFAULT_NOTEBOOK_FILETYPE, INotebookService, SQL_NOTEBOOK_PROVIDER } from 'sql/workbench/services/notebook/browser/notebookService';
import { URI } from 'vs/base/common/uri';
export const clusterEndpointsProperty = 'clusterEndpoints';
@@ -41,6 +41,10 @@ export function getStandardKernelsForProvider(providerId: string, notebookServic
return [];
}
let standardKernels = notebookService.getStandardKernelsForProvider(providerId);
if (!standardKernels || standardKernels.length === 0) {
// Fall back to using SQL provider instead
standardKernels = notebookService.getStandardKernelsForProvider(SQL_NOTEBOOK_PROVIDER) ?? [];
}
standardKernels.forEach(kernel => {
Object.assign(<IStandardKernelWithProvider>kernel, {
name: kernel.name,

View File

@@ -72,9 +72,9 @@ export interface INotebookService {
getSupportedFileExtensions(): string[];
getProvidersForFileType(fileType: string): string[];
getProvidersForFileType(fileType: string): string[] | undefined;
getStandardKernelsForProvider(provider: string): azdata.nb.IStandardKernel[];
getStandardKernelsForProvider(provider: string): azdata.nb.IStandardKernel[] | undefined;
getOrCreateSerializationManager(providerId: string, uri: URI): Promise<ISerializationManager>;

View File

@@ -306,27 +306,21 @@ export class NotebookService extends Disposable implements INotebookService {
private handleNewProviderDescriptions(p: { id: string; registration: ProviderDescriptionRegistration }) {
let registration = p.registration;
if (registration.fileExtensions) {
if (registration.fileExtensions?.length > 0) {
let extensions = registration.fileExtensions;
if (!this._serializationProviders.has(p.id)) {
// Only add a new provider descriptor if the provider
// supports file extensions beyond the default ipynb
let isNewFileType = (fileExt: string) => fileExt?.length > 0 && fileExt.toUpperCase() !== DEFAULT_NOTEBOOK_FILETYPE;
let addNewProvider = Array.isArray(extensions) ? extensions.some(ext => isNewFileType(ext)) : isNewFileType(extensions);
let addNewProvider = extensions.some(ext => ext?.length > 0 && ext.toUpperCase() !== DEFAULT_NOTEBOOK_FILETYPE);
if (addNewProvider) {
this._serializationProviders.set(p.id, new SerializationProviderDescriptor(p.id));
}
}
if (Array.isArray(extensions)) {
for (let fileType of extensions) {
this.addFileProvider(fileType, registration);
}
}
else {
this.addFileProvider(extensions, registration);
for (let fileType of extensions) {
this.addFileProvider(fileType, registration);
}
}
if (registration.standardKernels) {
if (registration.standardKernels?.length > 0) {
if (!this._executeProviders.has(p.id)) {
this._executeProviders.set(p.id, new ExecuteProviderDescriptor(p.id));
}
@@ -402,13 +396,9 @@ export class NotebookService extends Disposable implements INotebookService {
if (!standardKernels) {
standardKernels = [];
}
if (Array.isArray(provider.standardKernels)) {
provider.standardKernels.forEach(kernel => {
standardKernels.push(kernel);
});
} else {
standardKernels.push(provider.standardKernels);
}
provider.standardKernels.forEach(kernel => {
standardKernels.push(kernel);
});
// Filter out unusable kernels when running on a SAW
if (this.productService.quality === 'saw') {
standardKernels = standardKernels.filter(kernel => !kernel.blockedOnSAW);
@@ -420,14 +410,12 @@ export class NotebookService extends Disposable implements INotebookService {
return Array.from(this._fileToProviderDescriptions.keys());
}
getProvidersForFileType(fileType: string): string[] {
fileType = fileType.toUpperCase();
let providers = this._fileToProviderDescriptions.get(fileType);
return providers ? providers.map(provider => provider.provider) : undefined;
getProvidersForFileType(fileType: string): string[] | undefined {
let providers = this._fileToProviderDescriptions.get(fileType.toUpperCase());
return providers?.map(provider => provider.provider);
}
getStandardKernelsForProvider(provider: string): nb.IStandardKernel[] {
getStandardKernelsForProvider(provider: string): nb.IStandardKernel[] | undefined {
return this._providerToStandardKernels.get(provider.toUpperCase());
}
@@ -700,8 +688,8 @@ export class NotebookService extends Disposable implements INotebookService {
notebookRegistry.registerProviderDescription({
provider: serializationProvider.providerId,
fileExtensions: DEFAULT_NOTEBOOK_FILETYPE,
standardKernels: { name: notebookConstants.SQL, displayName: notebookConstants.SQL, connectionProviderIds: [notebookConstants.SQL_CONNECTION_PROVIDER] }
fileExtensions: [DEFAULT_NOTEBOOK_FILETYPE],
standardKernels: [{ name: notebookConstants.SQL, displayName: notebookConstants.SQL, connectionProviderIds: [notebookConstants.SQL_CONNECTION_PROVIDER] }]
});
}