Skip to content

Commit

Permalink
Merge branch 'taylor/pg-schema' into taylor/dg-support
Browse files Browse the repository at this point in the history
  • Loading branch information
tbantle22 committed Aug 22, 2024
2 parents 005c64d + 542a9a1 commit fbe3d21
Show file tree
Hide file tree
Showing 138 changed files with 1,378 additions and 1,024 deletions.
12 changes: 7 additions & 5 deletions graphql-server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"description": "",
"author": "DoltHub",
"private": true,
"packageManager": "[email protected]",
"scripts": {
"ci": "yarn prettier && yarn compile && yarn lint && yarn test && yarn build && yarn check-server",
"build": "nest build",
Expand All @@ -18,7 +19,8 @@
"prettier-fix": "prettier --write 'src/**/*.{js,ts}'",
"lint": "eslint --cache --ext .ts,.js,.tsx,.jsx .",
"lint-errors": "eslint --quiet --cache --ext .ts,.js,.tsx,.jsx .",
"test": "jest --passWithNoTests",
"test": "jest --silent",
"test:loud": "jest",
"yalc:react-lib": "yalc link @dolthub/react-hooks && yalc link @dolthub/web-utils",
"yalc:clean": "yalc remove --all"
},
Expand Down Expand Up @@ -52,6 +54,7 @@
"devDependencies": {
"@types/cookie-parser": "^1",
"@types/cors": "^2",
"@types/jest": "^29.5.12",
"@types/node": "^20.12.2",
"@types/semver": "^7",
"@typescript-eslint/eslint-plugin": "^7.5.0",
Expand All @@ -62,9 +65,9 @@
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-import": "^2.29.0",
"eslint-plugin-jest": "^27.9.0",
"jest": "^29.5.0",
"jest": "^29.7.0",
"prettier": "^3.1.1",
"ts-jest": "^29.1.1",
"ts-jest": "^29.2.4",
"ts-loader": "^9.5.1",
"ts-node": "^10.5.0",
"tsconfig-paths": "^4.2.0",
Expand All @@ -85,6 +88,5 @@
},
"coverageDirectory": "./coverage",
"testEnvironment": "node"
},
"packageManager": "[email protected]"
}
}
24 changes: 12 additions & 12 deletions graphql-server/schema.gql
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ type Branch {
lastCommitter: String!
lastUpdated: Timestamp!
table(tableName: String!): Table
tableNames(filterSystemTables: Boolean): [String!]!
tableNames(filterSystemTables: Boolean, schemaName: String): [String!]!
head: String
}

Expand Down Expand Up @@ -291,25 +291,25 @@ type Query {
currentDatabase: String
storedConnections: [DatabaseConnection!]!
databases: [String!]!
schemas: [String!]!
schemas(databaseName: String!): [String!]!
doltDatabaseDetails: DoltDatabaseDetails!
diffStat(databaseName: String!, fromRefName: String!, toRefName: String!, refName: String, type: CommitDiffType, tableName: String): DiffStat!
diffSummaries(databaseName: String!, fromRefName: String!, toRefName: String!, refName: String, type: CommitDiffType, tableName: String): [DiffSummary!]!
docs(databaseName: String!, refName: String!): DocList!
docOrDefaultDoc(refName: String!, databaseName: String!, docType: DocType): Doc
pullWithDetails(databaseName: String!, fromBranchName: String!, toBranchName: String!): PullWithDetails!
rowDiffs(offset: Int, databaseName: String!, fromRefName: String!, toRefName: String!, refName: String, tableName: String!, filterByRowType: DiffRowType, type: CommitDiffType): RowDiffList!
rows(refName: String!, databaseName: String!, tableName: String!, offset: Int): RowList!
rows(schemaName: String, refName: String!, databaseName: String!, tableName: String!, offset: Int): RowList!
schemaDiff(databaseName: String!, fromRefName: String!, toRefName: String!, refName: String, tableName: String!, type: CommitDiffType): SchemaDiff
doltSchemas(databaseName: String!, refName: String!): [SchemaItem!]!
views(databaseName: String!, refName: String!): [SchemaItem!]!
doltSchemas(refName: String!, databaseName: String!, schemaName: String): [SchemaItem!]!
views(refName: String!, databaseName: String!, schemaName: String): [SchemaItem!]!
doltProcedures(databaseName: String!, refName: String!): [SchemaItem!]!
sqlSelect(refName: String!, databaseName: String!, queryString: String!): SqlSelect!
sqlSelectForCsvDownload(refName: String!, databaseName: String!, queryString: String!): String!
sqlSelect(schemaName: String, refName: String!, databaseName: String!, queryString: String!): SqlSelect!
sqlSelectForCsvDownload(schemaName: String, refName: String!, databaseName: String!, queryString: String!): String!
status(databaseName: String!, refName: String!): [Status!]!
table(refName: String!, databaseName: String!, tableName: String!): Table!
tableNames(refName: String!, databaseName: String!, filterSystemTables: Boolean): TableNames!
tables(refName: String!, databaseName: String!, filterSystemTables: Boolean): [Table!]!
table(tableName: String!, refName: String!, databaseName: String!, schemaName: String): Table!
tableNames(schemaName: String, refName: String!, databaseName: String!, filterSystemTables: Boolean): TableNames!
tables(schemaName: String, refName: String!, databaseName: String!, filterSystemTables: Boolean): [Table!]!
tags(databaseName: String!): TagList!
tag(databaseName: String!, tagName: String!): Tag
}
Expand Down Expand Up @@ -344,9 +344,9 @@ type Mutation {
addDatabaseConnection(connectionUrl: String!, name: String!, hideDoltFeatures: Boolean, useSSL: Boolean, type: DatabaseType, schema: String): CurrentDatabaseState!
removeDatabaseConnection(name: String!): Boolean!
createDatabase(databaseName: String!): Boolean!
createSchema(schemaName: String!): Boolean!
createSchema(databaseName: String!, schemaName: String!): Boolean!
resetDatabase: Boolean!
loadDataFile(tableName: String!, refName: String!, databaseName: String!, importOp: ImportOperation!, fileType: FileType!, file: Upload!, modifier: LoadDataModifier): Boolean!
loadDataFile(schemaName: String, tableName: String!, refName: String!, databaseName: String!, importOp: ImportOperation!, fileType: FileType!, file: Upload!, modifier: LoadDataModifier): Boolean!
mergePull(fromBranchName: String!, toBranchName: String!, databaseName: String!, author: AuthorInfo): Boolean!
createTag(tagName: String!, databaseName: String!, message: String, fromRefName: String!, author: AuthorInfo): String!
deleteTag(databaseName: String!, tagName: String!): Boolean!
Expand Down
16 changes: 10 additions & 6 deletions graphql-server/src/branches/branch.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ class GetBranchTableArgs {
class FilterSystemTablesArgs {
@Field({ nullable: true })
filterSystemTables?: boolean;

@Field({ nullable: true })
schemaName?: string;
}

@ArgsType()
Expand All @@ -59,7 +62,7 @@ export class BranchResolver {

@Query(_returns => Branch, { nullable: true })
async branch(@Args() args: BranchArgs): Promise<Branch | undefined> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
const res = await conn.getBranch(args);
if (!res) return undefined;
return fromDoltBranchesRow(args.databaseName, res);
Expand All @@ -79,14 +82,14 @@ export class BranchResolver {

@Query(_returns => BranchList)
async branches(@Args() args: ListBranchesArgs): Promise<BranchList> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
const res = await conn.getBranches({ ...args, offset: args.offset ?? 0 });
return fromBranchListRes(res, args);
}

@Query(_returns => [Branch])
async allBranches(@Args() args: ListBranchesArgs): Promise<Branch[]> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
const res = await conn.getAllBranches(args);
return res.map(b => fromDoltBranchesRow(args.databaseName, b));
}
Expand All @@ -99,14 +102,14 @@ export class BranchResolver {

@Mutation(_returns => String)
async createBranch(@Args() args: CreateBranchArgs): Promise<string> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
await conn.createNewBranch({ ...args, branchName: args.newBranchName });
return args.newBranchName;
}

@Mutation(_returns => Boolean)
async deleteBranch(@Args() args: BranchArgs): Promise<boolean> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
await conn.callDeleteBranch(args);
return true;
}
Expand All @@ -126,11 +129,12 @@ export class BranchResolver {
@ResolveField(_returns => [String])
async tableNames(
@Parent() branch: Branch,
@Args() { filterSystemTables }: FilterSystemTablesArgs,
@Args() { filterSystemTables, schemaName }: FilterSystemTablesArgs,
): Promise<string[]> {
const { list } = await this.tableResolver.tableNames({
...branch,
filterSystemTables,
schemaName,
refName: branch.branchName,
});
return list;
Expand Down
2 changes: 1 addition & 1 deletion graphql-server/src/commits/commit.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export class CommitResolver {
if (err) throw err;
const refName = args.refName ?? args.afterCommitId ?? "";
const offset = args.offset ?? 0;
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);

if (args.twoDot && args.excludingCommitsFromRefName) {
const logs = await conn.getTwoDotLogs({
Expand Down
15 changes: 14 additions & 1 deletion graphql-server/src/connections/connection.provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { DoltQueryFactory } from "../queryFactory/dolt";
import { DoltgresQueryFactory } from "../queryFactory/doltgres";
import { MySQLQueryFactory } from "../queryFactory/mysql";
import { PostgresQueryFactory } from "../queryFactory/postgres";
import { replaceDatabaseInConnectionUrl } from "./util";

export class WorkbenchConfig {
hideDoltFeatures: boolean;
Expand All @@ -28,10 +29,22 @@ export class ConnectionProvider {

private workbenchConfig: WorkbenchConfig | undefined;

connection(): QueryFactory {
async connection(dbName?: string): Promise<QueryFactory> {
if (!this.qf) {
throw new Error("Data source service not initialized");
}
if (dbName && this.workbenchConfig?.type === DatabaseType.Postgres) {
const currentDb = await this.qf.currentDatabase();
if (currentDb !== dbName) {
await this.addConnection({
...this.workbenchConfig,
connectionUrl: replaceDatabaseInConnectionUrl(
this.workbenchConfig.connectionUrl,
dbName,
),
});
}
}
return this.qf;
}

Expand Down
40 changes: 40 additions & 0 deletions graphql-server/src/connections/util.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { replaceDatabaseInConnectionUrl } from "./util";

const tests = [
{
desc: "with existing database",
connectionUrl: "postgres://localhost:27017/test",
dbName: "newdb",
expected: "postgres://localhost:27017/newdb",
},
{
desc: "with user and existing database",
connectionUrl: "postgresql://taylor@localhost:5432/test",
dbName: "newdb",
expected: "postgresql://taylor@localhost:5432/newdb",
},
{
desc: "with user, password, and existing database",
connectionUrl: "postgresql://taylor:pass@localhost:5432/test",
dbName: "newdb",
expected: "postgresql://taylor:pass@localhost:5432/newdb",
},
{
desc: "with no database",
connectionUrl: "postgres://localhost:27017",
dbName: "newdb",
expected: "postgres://localhost:27017/newdb",
},
];

describe("test replaceDatabaseInConnectionUrl", () => {
tests.forEach(test => {
it(`should replace the database name in the connection URL ${test.desc}`, () => {
const result = replaceDatabaseInConnectionUrl(
test.connectionUrl,
test.dbName,
);
expect(result).toEqual(test.expected);
});
});
});
8 changes: 8 additions & 0 deletions graphql-server/src/connections/util.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export function replaceDatabaseInConnectionUrl(
connectionUrl: string,
dbName: string,
): string {
const url = new URL(connectionUrl);
url.pathname = `/${dbName}`;
return url.toString();
}
24 changes: 8 additions & 16 deletions graphql-server/src/databases/database.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export class DatabaseResolver {

@Query(_returns => String, { nullable: true })
async currentDatabase(): Promise<string | undefined> {
const conn = this.conn.connection();
const conn = await this.conn.connection();
return conn.currentDatabase();
}

Expand All @@ -87,7 +87,7 @@ export class DatabaseResolver {

@Query(_returns => [String])
async databases(): Promise<string[]> {
const conn = this.conn.connection();
const conn = await this.conn.connection();
const dbs = await conn.databases();
return dbs.filter(
db =>
Expand All @@ -99,12 +99,10 @@ export class DatabaseResolver {
}

@Query(_returns => [String])
async schemas(): Promise<string[]> {
const conn = this.conn.connection();
async schemas(@Args() args: DBArgs): Promise<string[]> {
const conn = await this.conn.connection(args.databaseName);
if (!conn.schemas) return [];
const db = await this.currentDatabase();
if (!db) return [];
const schemas = await conn.schemas({ databaseName: db });
const schemas = await conn.schemas(args);
return schemas.filter(
sch =>
sch !== "information_schema" &&
Expand All @@ -116,7 +114,7 @@ export class DatabaseResolver {
@Query(_returns => DoltDatabaseDetails)
async doltDatabaseDetails(): Promise<DoltDatabaseDetails> {
const workbenchConfig = this.conn.getWorkbenchConfig();
const conn = this.conn.connection();
const conn = await this.conn.connection();
return {
isDolt: conn.isDolt,
hideDoltFeatures: workbenchConfig?.hideDoltFeatures ?? false,
Expand Down Expand Up @@ -148,12 +146,6 @@ export class DatabaseResolver {
}

const db = await this.currentDatabase();
if (type === DatabaseType.Mysql) {
return { currentDatabase: db };
}
if (!db) {
throw new Error("Must provide database for Postgres connection");
}
return { currentDatabase: db, currentSchema: args.schema };
}

Expand All @@ -171,14 +163,14 @@ export class DatabaseResolver {

@Mutation(_returns => Boolean)
async createDatabase(@Args() args: DBArgs): Promise<boolean> {
const conn = this.conn.connection();
const conn = await this.conn.connection();
await conn.createDatabase(args);
return true;
}

@Mutation(_returns => Boolean)
async createSchema(@Args() args: SchemaArgs): Promise<boolean> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
if (!conn.createSchema) return false;
await conn.createSchema(args);
return true;
Expand Down
2 changes: 1 addition & 1 deletion graphql-server/src/diffStats/diffStat.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export class DiffStatResolver {

@Query(_returns => DiffStat)
async diffStat(@Args() args: DiffStatArgs): Promise<DiffStat> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
const type = args.type ?? CommitDiffType.TwoDot;
checkArgs(args);

Expand Down
2 changes: 1 addition & 1 deletion graphql-server/src/diffSummaries/diffSummary.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export class DiffSummaryResolver {

@Query(_returns => [DiffSummary])
async diffSummaries(@Args() args: DiffSummaryArgs): Promise<DiffSummary[]> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
return getDiffSummaries(conn, args);
}
}
Expand Down
4 changes: 2 additions & 2 deletions graphql-server/src/docs/doc.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class DocsResolver {
@Args()
args: RefArgs,
): Promise<DocList> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
const docRows = await conn.getDocs(args);
if (!docRows?.length) return { list: [] };
const sortedDocs = docRows.sort(d =>
Expand All @@ -34,7 +34,7 @@ export class DocsResolver {
async docOrDefaultDoc(
@Args() args: GetDefaultDocArgs,
): Promise<Doc | undefined> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
const docRows = await conn.getDocs(args);
if (!docRows?.length) return undefined;

Expand Down
2 changes: 1 addition & 1 deletion graphql-server/src/pulls/pull.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ export class PullResolver {

@Mutation(_returns => Boolean)
async mergePull(@Args() args: MergePullArgs): Promise<boolean> {
const conn = this.conn.connection();
const conn = await this.conn.connection(args.databaseName);
await conn.callMerge({
databaseName: args.databaseName,
fromBranchName: args.fromBranchName,
Expand Down
2 changes: 1 addition & 1 deletion graphql-server/src/queryFactory/dolt/doltEntityManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ export async function getDoltProcedures(
export async function getDoltBranch(
em: EntityManager,
args: t.BranchArgs,
): t.UPR {
): t.USPR {
return em
.createQueryBuilder()
.select("*")
Expand Down
2 changes: 1 addition & 1 deletion graphql-server/src/queryFactory/dolt/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ export class DoltQueryFactory
);
}

async getBranch(args: t.BranchArgs): t.UPR {
async getBranch(args: t.BranchArgs): t.USPR {
return this.queryForBuilder(
async em => dem.getDoltBranch(em, args),
args.databaseName,
Expand Down
Loading

0 comments on commit fbe3d21

Please sign in to comment.