diff --git a/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls index b2022dd4c4..ee5becd680 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls @@ -30,8 +30,6 @@ type DatabaseObjectInfo { description: String # Object type. Java class name in most cases type: String - # NavigationNodeInfo for object - navNode: NavigatorNodeInfo # Read object properties. # Optional parameter 'ids' filters properties by id. null means all properties. @@ -86,8 +84,8 @@ type NavigatorNodeInfo { } type DatabaseCatalog { - catalog: DatabaseObjectInfo! - schemaList: [ DatabaseObjectInfo! ]! + catalog: NavigatorNodeInfo! + schemaList: [ NavigatorNodeInfo! ]! } type DatabaseStructContainers { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebCatalog.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebCatalog.java index 0f35772d9c..f763be9e81 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebCatalog.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebCatalog.java @@ -30,23 +30,23 @@ public class WebCatalog { private static final Log log = Log.getLog(WebCatalog.class); - private WebDatabaseObjectInfo catalog; - private List schemaList = new ArrayList<>(); + private WebNavigatorNodeInfo catalog; + private List schemaList = new ArrayList<>(); - public WebCatalog(@NotNull WebDatabaseObjectInfo catalog) { + public WebCatalog(@NotNull WebNavigatorNodeInfo catalog) { this.catalog = catalog; } @NotNull - public WebDatabaseObjectInfo getCatalog() { + public WebNavigatorNodeInfo getCatalog() { return catalog; } - public List getSchemaList() { + public List getSchemaList() { return schemaList; } - public void setSchemaList(List schemaList) { + public void setSchemaList(List schemaList) { this.schemaList = schemaList; } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebDatabaseObjectInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebDatabaseObjectInfo.java index bc1d0dbd9b..2dce548c9e 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebDatabaseObjectInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebDatabaseObjectInfo.java @@ -55,15 +55,6 @@ public class WebDatabaseObjectInfo { // General properties /////////////////////////////////// - @Property - public WebNavigatorNodeInfo getNavNode(){ - DBNModel navigatorModel = session.getNavigatorModel(); - DBRProgressMonitor monitor = this.session.getProgressMonitor(); - DBNNode node = navigatorModel.getNodeByObject(monitor, this.object, false); - - return node == null ? null : new WebNavigatorNodeInfo(session, node); - } - @Property public String getName() { return object.getName(); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java index e0a58dbc9c..017184256e 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java @@ -23,6 +23,7 @@ import io.cloudbeaver.model.WebConnectionInfo; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.navigator.*; import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBUtils; @@ -189,30 +190,36 @@ public class WebServiceNavigator implements DBWServiceNavigator { } if(node instanceof DBSCatalog) { - WebDatabaseObjectInfo catalogObjectInfo = new WebDatabaseObjectInfo(connection.getSession(), node); - WebCatalog webCatalog = new WebCatalog(catalogObjectInfo); + WebNavigatorNodeInfo catalogObjectInfo = this.getNodeFromObject(connection.getSession(), node); - if(contextDefaults.supportsSchemaChange()) { - try { + if (catalogObjectInfo != null) { + WebCatalog webCatalog = new WebCatalog(catalogObjectInfo); - List schemaList = webCatalog.getSchemaList(); - Collection objectsCollection = ((DBSObjectContainer) node).getChildren(monitor); + if (contextDefaults.supportsSchemaChange()) { + try { + List schemaList = webCatalog.getSchemaList(); + Collection objectsCollection = ((DBSObjectContainer) node).getChildren(monitor); - for (DBSObject schemaObject : objectsCollection) { - if (!dataSource.getContainer().getNavigatorSettings().isShowSystemObjects() && DBUtils.isSystemObject(node)) { - continue; - } - if (schemaObject instanceof DBSSchema) { - schemaList.add(new WebDatabaseObjectInfo(connection.getSession(), schemaObject)); + for (DBSObject schemaObject : objectsCollection) { + if (!dataSource.getContainer().getNavigatorSettings().isShowSystemObjects() && DBUtils.isSystemObject(node)) { + continue; + } + if (schemaObject instanceof DBSSchema) { + WebNavigatorNodeInfo schemaNodeInfo = this.getNodeFromObject(connection.getSession(), schemaObject); + + if(schemaNodeInfo != null){ + schemaList.add(schemaNodeInfo); + } + } } + } catch (DBException e) { +// throw new DBWebException("Error reading schema list", e); + // TODO: we need to log some message to console } - } catch (DBException e) { -// throw new DBWebException("Error reading schema list", e); - // TODO: we need to log some message to console } - } - catalogList.add(webCatalog); + catalogList.add(webCatalog); + } } } return structContainers; @@ -236,6 +243,15 @@ public class WebServiceNavigator implements DBWServiceNavigator { return Collections.emptyList(); } + @Nullable + protected WebNavigatorNodeInfo getNodeFromObject(WebSession session, DBSObject object){ + DBNModel navigatorModel = session.getNavigatorModel(); + DBRProgressMonitor monitor = session.getProgressMonitor(); + DBNNode node = navigatorModel.getNodeByObject(monitor, object, false); + + return node == null ? null : new WebNavigatorNodeInfo(session, node); + } + @Override public String renameNode(@NotNull WebSession session, @NotNull String nodePath, @NotNull String newName) throws DBWebException { try { @@ -289,7 +305,8 @@ public class WebServiceNavigator implements DBWServiceNavigator { Map options = new LinkedHashMap<>(); for (Map.Entry ne : nodes.entrySet()) { DBSObject object = ne.getKey().getObject(); - DBCExecutionContext executionContext = getCommandExecutionContext(object); + DBPDataSource dataSource = ((DBNDatabaseNode) object).getDataSource(); + DBCExecutionContext executionContext = getCommandExecutionContext(dataSource); DBECommandContext commandContext = new WebCommandContext(executionContext, false); ne.getValue().deleteObject(commandContext, object, options); commandContext.saveChanges(session.getProgressMonitor(), options); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java index a149908f9d..3b3654e49d 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/WebSQLProcessor.java @@ -64,8 +64,6 @@ public class WebSQLProcessor { private final SQLRuleManager ruleManager; private final Map contexts = new LinkedHashMap<>(); - private AtomicInteger contextId = new AtomicInteger(); - WebSQLProcessor(@NotNull WebSession webSession, @NotNull WebConnectionInfo connection) { this.webSession = webSession; this.connection = connection; @@ -110,10 +108,10 @@ public class WebSQLProcessor { @NotNull public WebSQLContextInfo createContext(String defaultCatalog, String defaultSchema) throws DBCException { - String contextId = String.valueOf(this.contextId.incrementAndGet()); - WebSQLContextInfo contextInfo = new WebSQLContextInfo(this, contextId, defaultCatalog, defaultSchema); + UUID uuid = UUID.randomUUID(); + WebSQLContextInfo contextInfo = new WebSQLContextInfo(this, uuid.toString(), defaultCatalog, defaultSchema); synchronized (contexts) { - contexts.put(contextId, contextInfo); + contexts.put(uuid.toString(), contextInfo); } return contextInfo; } diff --git a/server/product/web-server/CloudbeaverServer.product.launch b/server/product/web-server/CloudbeaverServer.product.launch index bb1cf93eca..71cf7c51cd 100644 --- a/server/product/web-server/CloudbeaverServer.product.launch +++ b/server/product/web-server/CloudbeaverServer.product.launch @@ -22,7 +22,7 @@ - + @@ -100,7 +100,7 @@ - + diff --git a/webapp/packages/core-connections/src/ConnectionExecutionContext/ConnectionExecutionContextResource.ts b/webapp/packages/core-connections/src/ConnectionExecutionContext/ConnectionExecutionContextResource.ts index ac47feab4c..c0f9fa9fa9 100644 --- a/webapp/packages/core-connections/src/ConnectionExecutionContext/ConnectionExecutionContextResource.ts +++ b/webapp/packages/core-connections/src/ConnectionExecutionContext/ConnectionExecutionContextResource.ts @@ -57,7 +57,7 @@ export class ConnectionExecutionContextResource extends CachedMapResource context.baseId) + )).map(context => context.id) ) ); } @@ -170,13 +170,13 @@ export class ConnectionExecutionContextResource extends CachedMapResource this.values.filter(context => context.connectionId === connectionId) - )).map(context => context.baseId) + )).map(context => context.id) ) ); } private updateContexts(...contexts: IConnectionExecutionContextInfo[]): ResourceKeyList { - const key = resourceKeyList(contexts.map(context => context.baseId)); + const key = resourceKeyList(contexts.map(context => context.id)); const oldContexts = this.get(key); this.set(key, oldContexts.map((context, i) => ({ ...context, ...contexts[i] }))); @@ -188,7 +188,6 @@ export class ConnectionExecutionContextResource extends CachedMapResource { const context = await this.connectionExecutionContextResource.create(connectionId, defaultCatalog, defaultSchema); - return this.contexts.get(context.baseId); + return this.contexts.get(context.id); } } diff --git a/webapp/packages/core-connections/src/ConnectionExecutionContext/IConnectionExecutionContextInfo.ts b/webapp/packages/core-connections/src/ConnectionExecutionContext/IConnectionExecutionContextInfo.ts index 492e838241..b51bb4d588 100644 --- a/webapp/packages/core-connections/src/ConnectionExecutionContext/IConnectionExecutionContextInfo.ts +++ b/webapp/packages/core-connections/src/ConnectionExecutionContext/IConnectionExecutionContextInfo.ts @@ -9,5 +9,4 @@ import type { SqlContextInfo } from '@cloudbeaver/core-sdk'; export interface IConnectionExecutionContextInfo extends SqlContextInfo { - baseId: string; } diff --git a/webapp/packages/core-connections/src/ContainerResource.ts b/webapp/packages/core-connections/src/ContainerResource.ts index e44654bdeb..8c1acc7263 100644 --- a/webapp/packages/core-connections/src/ContainerResource.ts +++ b/webapp/packages/core-connections/src/ContainerResource.ts @@ -12,13 +12,13 @@ import { injectable } from '@cloudbeaver/core-di'; import { GraphQLService, CachedDataResource, - DatabaseObjectInfo, ICachedResourceMetadata, ResourceKeyUtils, CachedMapAllKey + NavNodeInfoFragment, ICachedResourceMetadata, ResourceKeyUtils, CachedMapAllKey } from '@cloudbeaver/core-sdk'; import { MetadataMap } from '@cloudbeaver/core-utils'; import { ConnectionInfoResource } from './ConnectionInfoResource'; -export type ObjectContainer = Pick; +export type ObjectContainer = NavNodeInfoFragment; export interface ICatalogData { catalog: ObjectContainer; schemaList: ObjectContainer[]; @@ -139,6 +139,7 @@ string const { navGetStructContainers } = await this.graphQLService.sdk.navGetStructContainers({ connectionId, catalogId, + withDetails: false, }); this.data.set(connectionId, navGetStructContainers.catalogList); diff --git a/webapp/packages/core-sdk/src/queries/database/navGetStructContainers.gql b/webapp/packages/core-sdk/src/queries/database/navGetStructContainers.gql index c513f15c7e..02ac0053eb 100644 --- a/webapp/packages/core-sdk/src/queries/database/navGetStructContainers.gql +++ b/webapp/packages/core-sdk/src/queries/database/navGetStructContainers.gql @@ -1,23 +1,11 @@ -query navGetStructContainers($connectionId: ID!, $catalogId: ID) { +query navGetStructContainers($connectionId: ID!, $catalogId: ID, $withDetails: Boolean!) { navGetStructContainers(connectionId: $connectionId, catalog: $catalogId) { catalogList { catalog { - name - description - type - navNode { - id - } - features + ...NavNodeInfo } schemaList { - name - description - type - navNode { - id - } - features + ...NavNodeInfo } } } diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts index afe9653385..fa7a17959d 100644 --- a/webapp/packages/core-sdk/src/sdk.ts +++ b/webapp/packages/core-sdk/src/sdk.ts @@ -225,8 +225,8 @@ export interface DatabaseAuthModel { } export interface DatabaseCatalog { - catalog: DatabaseObjectInfo; - schemaList: DatabaseObjectInfo[]; + catalog: NavigatorNodeInfo; + schemaList: NavigatorNodeInfo[]; } export interface DatabaseDocument { @@ -242,7 +242,6 @@ export interface DatabaseObjectInfo { features?: Maybe>; fullyQualifiedName?: Maybe; name?: Maybe; - navNode?: Maybe; ordinalPosition?: Maybe; overloadedName?: Maybe; properties?: Maybe>>; @@ -1672,9 +1671,10 @@ export interface RemoveDataTransferFileQuery { result?: Maybe } export type NavGetStructContainersQueryVariables = Exact<{ connectionId: Scalars['ID']; catalogId?: Maybe; + withDetails: Scalars['Boolean']; }>; -export interface NavGetStructContainersQuery { navGetStructContainers: { catalogList: Array<{ catalog: { name?: Maybe; description?: Maybe; type?: Maybe; features?: Maybe; navNode?: Maybe<{ id: string }> }; schemaList: Array<{ name?: Maybe; description?: Maybe; type?: Maybe; features?: Maybe; navNode?: Maybe<{ id: string }> }> }> } } +export interface NavGetStructContainersQuery { navGetStructContainers: { catalogList: Array<{ catalog: { id: string; name?: Maybe; hasChildren?: Maybe; nodeType?: Maybe; icon?: Maybe; folder?: Maybe; inline?: Maybe; navigable?: Maybe; features?: Maybe; object?: Maybe<{ features?: Maybe }>; nodeDetails?: Maybe; category?: Maybe; dataType?: Maybe; description?: Maybe; displayName?: Maybe; length: ObjectPropertyLength; features: string[]; value?: Maybe; order: number }>> }; schemaList: Array<{ id: string; name?: Maybe; hasChildren?: Maybe; nodeType?: Maybe; icon?: Maybe; folder?: Maybe; inline?: Maybe; navigable?: Maybe; features?: Maybe; object?: Maybe<{ features?: Maybe }>; nodeDetails?: Maybe; category?: Maybe; dataType?: Maybe; description?: Maybe; displayName?: Maybe; length: ObjectPropertyLength; features: string[]; value?: Maybe; order: number }>> }> }> } } export type FormatSqlQueryQueryVariables = Exact<{ connectionId: Scalars['ID']; @@ -2766,31 +2766,19 @@ export const RemoveDataTransferFileDocument = ` } `; export const NavGetStructContainersDocument = ` - query navGetStructContainers($connectionId: ID!, $catalogId: ID) { + query navGetStructContainers($connectionId: ID!, $catalogId: ID, $withDetails: Boolean!) { navGetStructContainers(connectionId: $connectionId, catalog: $catalogId) { catalogList { catalog { - name - description - type - navNode { - id - } - features + ...NavNodeInfo } schemaList { - name - description - type - navNode { - id - } - features + ...NavNodeInfo } } } } - `; + ${NavNodeInfoFragmentDoc}`; export const FormatSqlQueryDocument = ` query formatSqlQuery($connectionId: ID!, $contextId: ID!, $query: String!) { query: sqlFormatQuery( diff --git a/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorTabService.ts b/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorTabService.ts index 619887efc3..ad34c9e73a 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorTabService.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab/src/SqlEditorTabService.ts @@ -103,7 +103,7 @@ export class SqlEditorTabService extends Bootstrap { ); for (const tab of tabs) { - const executionContext = this.connectionExecutionContextService.get(tab.handlerState.executionContext!.baseId); + const executionContext = this.connectionExecutionContextService.get(tab.handlerState.executionContext!.id); if (!executionContext?.context) { this.resetConnectionInfo(tab.handlerState); @@ -119,7 +119,7 @@ export class SqlEditorTabService extends Bootstrap { ); for (const tab of tabs) { - if (ResourceKeyUtils.includes(key, tab.handlerState.executionContext!.baseId)) { + if (ResourceKeyUtils.includes(key, tab.handlerState.executionContext!.id)) { this.resetConnectionInfo(tab.handlerState); } } @@ -137,7 +137,6 @@ export class SqlEditorTabService extends Bootstrap { || !['undefined', 'object'].includes(typeof tab.handlerState.executionContext) || !['string', 'undefined', 'object'].includes(typeof tab.handlerState.executionContext?.connectionId) || !['string', 'undefined', 'object'].includes(typeof tab.handlerState.executionContext?.id) - || !['string', 'undefined', 'object'].includes(typeof tab.handlerState.executionContext?.baseId) || !['string', 'undefined', 'object'].includes(typeof tab.handlerState.executionContext?.defaultCatalog) || !['string', 'undefined', 'object'].includes(typeof tab.handlerState.executionContext?.defaultSchema) || !['string', 'undefined', 'object'].includes(typeof tab.handlerState.currentTabId) @@ -153,7 +152,7 @@ export class SqlEditorTabService extends Bootstrap { if (tab.handlerState.executionContext) { await this.connectionInfo.load(CachedMapAllKey); await this.connectionExecutionContextResource.loadAll(); - const executionContext = this.connectionExecutionContextService.get(tab.handlerState.executionContext.baseId); + const executionContext = this.connectionExecutionContextService.get(tab.handlerState.executionContext.id); if (!executionContext) { this.resetConnectionInfo(tab.handlerState); @@ -210,7 +209,7 @@ export class SqlEditorTabService extends Bootstrap { return false; } - const executionContext = this.connectionExecutionContextService.get(tab.handlerState.executionContext.baseId); + const executionContext = this.connectionExecutionContextService.get(tab.handlerState.executionContext.id); if (!executionContext) { return false; @@ -234,7 +233,7 @@ export class SqlEditorTabService extends Bootstrap { return false; } - const executionContext = this.connectionExecutionContextService.get(tab.handlerState.executionContext.baseId); + const executionContext = this.connectionExecutionContextService.get(tab.handlerState.executionContext.id); if (!executionContext) { return false; @@ -266,13 +265,13 @@ export class SqlEditorTabService extends Bootstrap { } private async destroyContext(contextInfo: IConnectionExecutionContextInfo) { - const executionContext = this.connectionExecutionContextService.get(contextInfo.baseId); + const executionContext = this.connectionExecutionContextService.get(contextInfo.id); if (executionContext) { try { await executionContext.destroy(); } catch (exception) { - this.notificationService.logException(exception, `Failed to destroy SQL-context ${executionContext.context?.baseId}`, '', true); + this.notificationService.logException(exception, `Failed to destroy SQL-context ${executionContext.context?.id}`, '', true); } } } diff --git a/webapp/packages/plugin-sql-editor-screen/src/Screen/SqlEditorScreen.tsx b/webapp/packages/plugin-sql-editor-screen/src/Screen/SqlEditorScreen.tsx index 8998fd3873..e27eb77697 100644 --- a/webapp/packages/plugin-sql-editor-screen/src/Screen/SqlEditorScreen.tsx +++ b/webapp/packages/plugin-sql-editor-screen/src/Screen/SqlEditorScreen.tsx @@ -49,7 +49,7 @@ export const SqlEditorScreen: ScreenComponent = observer }, }), { state: observable }, false); - if (context?.context?.baseId !== state.state?.executionContext?.baseId) { + if (context?.context?.id !== state.state?.executionContext?.id) { state.setState(context?.context); } diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditorController.tsx b/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditorController.tsx index 211fcaf0f3..d1bcb4d1a1 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditorController.tsx +++ b/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditorController.tsx @@ -61,7 +61,7 @@ export class SqlEditorController implements IInitializableController, IDestructi return true; } - const context = this.connectionExecutionContextService.get(this.state.executionContext.baseId); + const context = this.connectionExecutionContextService.get(this.state.executionContext.id); return context?.executing || false; } diff --git a/webapp/packages/plugin-sql-editor/src/SqlResultTabs/ExecutionPlan/SqlExecutionPlanService.ts b/webapp/packages/plugin-sql-editor/src/SqlResultTabs/ExecutionPlan/SqlExecutionPlanService.ts index 5ae8bf3bda..4992714e84 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlResultTabs/ExecutionPlan/SqlExecutionPlanService.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlResultTabs/ExecutionPlan/SqlExecutionPlanService.ts @@ -45,7 +45,7 @@ export class SqlExecutionPlanService { ): Promise { const contextInfo = editorState.executionContext; - const executionContext = contextInfo && this.connectionExecutionContextService.get(contextInfo.baseId); + const executionContext = contextInfo && this.connectionExecutionContextService.get(contextInfo.id); if (!contextInfo || !executionContext) { console.error('executeExecutionPlan executionContext is not provided'); diff --git a/webapp/packages/plugin-sql-editor/src/SqlResultTabs/SqlQueryService.ts b/webapp/packages/plugin-sql-editor/src/SqlResultTabs/SqlQueryService.ts index 135e518a68..c4023ed339 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlResultTabs/SqlQueryService.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlResultTabs/SqlQueryService.ts @@ -61,7 +61,7 @@ export class SqlQueryService { inNewTab: boolean ): Promise { const contextInfo = editorState.executionContext; - const executionContext = contextInfo && this.connectionExecutionContextService.get(contextInfo.baseId); + const executionContext = contextInfo && this.connectionExecutionContextService.get(contextInfo.id); if (!contextInfo || !executionContext) { console.error('executeEditorQuery executionContext is not provided'); @@ -126,7 +126,7 @@ export class SqlQueryService { options?: IQueryExecutionOptions ): Promise { const contextInfo = editorState.executionContext; - const executionContext = contextInfo && this.connectionExecutionContextService.get(contextInfo.baseId); + const executionContext = contextInfo && this.connectionExecutionContextService.get(contextInfo.id); if (!contextInfo || !executionContext) { console.error('executeEditorQuery executionContext is not provided');