Skip to content

Commit

Permalink
Add connection side panel and editor to vscode extension (#224)
Browse files Browse the repository at this point in the history
  • Loading branch information
daveajrussell authored Jun 20, 2024
1 parent 68f66d0 commit 0ccbb30
Show file tree
Hide file tree
Showing 44 changed files with 2,397 additions and 91 deletions.
162 changes: 157 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

55 changes: 34 additions & 21 deletions packages/language-server/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,34 +96,47 @@ connection.onSignatureHelp(doSignatureHelp(documents, neo4jSchemaPoller));
// Trigger the auto completion
connection.onCompletion(doAutoCompletion(documents, neo4jSchemaPoller));

connection.onDidChangeConfiguration(
(params: { settings: { neo4j: Neo4jSettings } }) => {
neo4jSchemaPoller.disconnect();

const neo4jConfig = params.settings.neo4j;
if (
neo4jSchemaPoller.connection === undefined &&
neo4jConfig.connect &&
neo4jConfig.password &&
neo4jConfig.connectURL &&
neo4jConfig.user
) {
void neo4jSchemaPoller.persistentConnect(
neo4jConfig.connectURL,
{
username: neo4jConfig.user,
password: neo4jConfig.password,
},
{ appName: 'cypher-language-server' },
);
}
connection.onNotification(
'connectionUpdated',
(connectionSettings: Neo4jSettings) => {
changeConnection(connectionSettings);
},
);

connection.onNotification('connectionDeleted', () => {
disconnect();
});

documents.listen(connection);

connection.listen();

connection.onExit(() => {
cleanupWorkers();
});

const changeConnection = (connectionSettings: Neo4jSettings) => {
disconnect();

if (
neo4jSchemaPoller.connection === undefined &&
connectionSettings.connect &&
connectionSettings.password &&
connectionSettings.connectURL &&
connectionSettings.user
) {
void neo4jSchemaPoller.persistentConnect(
connectionSettings.connectURL,
{
username: connectionSettings.user,
password: connectionSettings.password,
},
{ appName: 'cypher-language-server' },
connectionSettings.database,
);
}
};

const disconnect = () => {
neo4jSchemaPoller.disconnect();
};
3 changes: 2 additions & 1 deletion packages/language-server/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ export type Neo4jSettings = {
server: 'off' | 'messages' | 'verbose';
};
connect?: boolean;
user?: string;
password?: string;
connectURL?: string;
user?: string;
database?: string;
};
2 changes: 1 addition & 1 deletion packages/schema-poller/src/metadataPoller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ export class MetadataPoller {

this.dataSummary = new QueryPoller({
connection,
queryArgs: getDataSummary(),
queryArgs: getDataSummary(connection.currentDb),
onRefetchDone: (result) => {
if (result.success) {
const { labels, propertyKeys, relationshipTypes } = result.data;
Expand Down
15 changes: 12 additions & 3 deletions packages/schema-poller/src/neo4jConnection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@ const METADATA_BASE = {
version: version,
};

function resolveInitialDatabase(databases: Database[]): string {
function resolveInitialDatabase(
databases: Database[],
database?: string,
): string | undefined {
if (database) {
return databases.find((d) => d.name === database)?.name;
}

const home = databases.find((d) => d.home);
const def = databases.find((d) => d.default);
const system = databases.find((d) => d.name === 'system');

return home?.name ?? def?.name ?? system?.name ?? databases[0]?.name;
}

Expand All @@ -20,15 +28,16 @@ type SdkQueryArgs = {
abortSignal?: AbortSignal;
};
export class Neo4jConnection {
public currentDb: string;
public currentDb: string | undefined;

constructor(
public connectedUser: string,
public protocolVersion: string,
databases: Database[],
public driver: Driver,
database?: string,
) {
this.currentDb = resolveInitialDatabase(databases);
this.currentDb = resolveInitialDatabase(databases, database);
}

async runSdkQuery<T>(
Expand Down
6 changes: 4 additions & 2 deletions packages/schema-poller/src/queries/dataSummary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ export type DataSummary = {

const ITEM_LIMIT = 1000;

export function getDataSummary(): ExecuteQueryArgs<DataSummary> {
export function getDataSummary(
database?: string,
): ExecuteQueryArgs<DataSummary> {
const query = `CALL db.labels() YIELD label
RETURN COLLECT(label)[..${ITEM_LIMIT}] AS result
UNION ALL
Expand All @@ -35,6 +37,6 @@ RETURN COLLECT(propertyKey)[..${ITEM_LIMIT}] AS result`;

return {
query,
queryConfig: { resultTransformer, routing: 'READ' },
queryConfig: { resultTransformer, routing: 'READ', database: database },
};
}
Loading

0 comments on commit 0ccbb30

Please sign in to comment.