Skip to content

Commit

Permalink
web,graphql: Progress on doltgres support
Browse files Browse the repository at this point in the history
  • Loading branch information
tbantle22 committed Aug 20, 2024
1 parent 08bf568 commit 19c4a67
Show file tree
Hide file tree
Showing 13 changed files with 99 additions and 122 deletions.
65 changes: 38 additions & 27 deletions graphql-server/src/queryFactory/doltgres/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,25 +63,25 @@ export class DoltgresQueryFactory

async createNewBranch(args: t.BranchArgs & { fromRefName: string }): t.PR {
return this.query(
qh.callNewBranch,
[args.branchName, args.fromRefName],
`SELECT DOLT_BRANCH('${args.branchName}', '${args.fromRefName}')`,
[],
args.databaseName,
);
}

async callDeleteBranch(args: t.BranchArgs): t.PR {
return this.query(
qh.callDeleteBranch,
[args.branchName],
`SELECT DOLT_BRANCH('-D', '${args.branchName}')`,
[],
args.databaseName,
);
}

async getLogs(args: t.RefArgs, offset: number): t.PR {
return handleRefNotFound(async () =>
this.query(
qh.doltLogsQuery,
[args.refName, ROW_LIMIT + 1, offset],
`SELECT * FROM DOLT_LOG('${args.refName}', '--parents') LIMIT ${ROW_LIMIT + 1} OFFSET ${offset}`,
[],
args.databaseName,
),
);
Expand All @@ -90,80 +90,81 @@ export class DoltgresQueryFactory
async getTwoDotLogs(args: t.RefsArgs): t.PR {
return handleRefNotFound(async () =>
this.query(
qh.twoDotDoltLogsQuery,
[`${args.toRefName}..${args.fromRefName}`],
`SELECT * FROM DOLT_LOG('${args.toRefName}..${args.fromRefName}', '--parents')`,
[],
args.databaseName,
),
);
}

async getDiffStat(args: t.RefsMaybeTableArgs): t.PR {
return this.query(
qh.getDiffStatQuery(!!args.tableName),
[args.fromRefName, args.toRefName, args.tableName],
`SELECT * FROM DOLT_DIFF_STAT('${args.fromRefName}', '${args.toRefName}'${args.tableName ? `, '${args.tableName}'` : ""})`,
[],
args.databaseName,
args.refName,
);
}

async getThreeDotDiffStat(args: t.RefsMaybeTableArgs): t.PR {
return this.query(
qh.getThreeDotDiffStatQuery(!!args.tableName),
[`${args.toRefName}...${args.fromRefName}`, args.tableName],
`SELECT * FROM DOLT_DIFF_STAT('${args.toRefName}...${args.fromRefName}'${args.tableName ? `, '${args.tableName}'` : ""})`,
[],
args.databaseName,
args.refName,
);
}

async getDiffSummary(args: t.RefsMaybeTableArgs): t.PR {
const refArgs = [args.fromRefName, args.toRefName];

Check failure on line 119 in graphql-server/src/queryFactory/doltgres/index.ts

View workflow job for this annotation

GitHub Actions / ci

'refArgs' is assigned a value but never used. Allowed unused vars must match /^_/u
return this.query(
qh.getDiffSummaryQuery(!!args.tableName),
[args.fromRefName, args.toRefName, args.tableName],
`SELECT * FROM DOLT_DIFF_SUMMARY('${args.fromRefName}', '${args.toRefName}'${args.tableName ? `, '${args.tableName}'` : ""})`,
[],
args.databaseName,
args.refName,
);
}

async getThreeDotDiffSummary(args: t.RefsMaybeTableArgs): t.PR {
return this.query(
qh.getThreeDotDiffSummaryQuery(!!args.tableName),
[`${args.toRefName}...${args.fromRefName}`, args.tableName],
`SELECT * FROM DOLT_DIFF_SUMMARY('${args.toRefName}...${args.fromRefName}'${args.tableName ? `, '${args.tableName}'` : ""})`,
[],
args.databaseName,
args.refName,
);
}

async getSchemaPatch(args: t.RefsTableArgs): t.PR {
return this.query(
qh.schemaPatchQuery,
[args.fromRefName, args.toRefName, args.tableName],
`SELECT * FROM DOLT_PATCH('${args.fromRefName}', '${args.toRefName}', '${args.tableName}') WHERE diff_type='schema'`,
[],
args.databaseName,
args.refName,
);
}

async getThreeDotSchemaPatch(args: t.RefsTableArgs): t.PR {
return this.query(
qh.threeDotSchemaPatchQuery,
[`${args.toRefName}...${args.fromRefName}`, args.tableName],
`SELECT * FROM DOLT_PATCH('${args.toRefName}...${args.fromRefName}', '${args.tableName}') WHERE diff_type='schema'`,
[],
args.databaseName,
args.refName,
);
}

async getSchemaDiff(args: t.RefsTableArgs): t.PR {
return this.query(
qh.schemaDiffQuery,
[args.fromRefName, args.toRefName, args.tableName],
`SELECT * FROM DOLT_SCHEMA_DIFF('${args.fromRefName}', '${args.toRefName}', '${args.tableName}')`,
[],
args.databaseName,
args.refName,
);
}

async getThreeDotSchemaDiff(args: t.RefsTableArgs): t.PR {
return this.query(
qh.threeDotSchemaDiffQuery,
[`${args.toRefName}...${args.fromRefName}`, args.tableName],
`SELECT * FROM DOLT_SCHEMA_DIFF('${args.toRefName}...${args.fromRefName}', '${args.tableName}')`,
[],
args.databaseName,
args.refName,
);
Expand Down Expand Up @@ -214,14 +215,21 @@ export class DoltgresQueryFactory
params.push(getAuthorString(args.author));
}
return this.query(
qh.getCallNewTag(!!args.message, !!args.author),
`SELECT DOLT_TAG('${args.tagName}', '${args.fromRefName}'${args.message ? `, '-m', '${args.message}'` : ""}${qh.getAuthorNameString(
!!args.author,
`'${args.author}'`,
)})`,
params,
args.databaseName,
);
}

async callDeleteTag(args: t.TagArgs): t.PR {
return this.query(qh.callDeleteTag, [args.tagName], args.databaseName);
return this.query(
`SELECT DOLT_TAG('-d', '${args.tagName}')`,
[],
args.databaseName,
);
}

async callMerge(
Expand All @@ -238,7 +246,10 @@ export class DoltgresQueryFactory
if (args.author) {
params.push(getAuthorString(args.author));
}
const res = await query(qh.getCallMerge(!!args.author), params);
const res = await query(
`SELECT DOLT_MERGE('${args.fromBranchName}', '--no-ff', '-m', 'Merge branch ${args.fromBranchName}'${qh.getAuthorNameString(!!args.author, `'${args.author}'`)})`,
params,
);

if (res.length && res[0].conflicts !== "0") {
await query("ROLLBACK");
Expand Down
16 changes: 8 additions & 8 deletions graphql-server/src/queryFactory/doltgres/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ import { RawRows } from "../types";

// BRANCHES

export const callNewBranch = `CALL DOLT_BRANCH($1, $2)`;
export const callNewBranch = `SELECT DOLT_BRANCH($1, $2)`;

export const callDeleteBranch = `CALL DOLT_BRANCH('-D', $1)`;
export const callDeleteBranch = `SELECT DOLT_BRANCH('-D', $1)`;

// COMMITS

Expand Down Expand Up @@ -61,21 +61,21 @@ export const threeDotSchemaDiffQuery = `SELECT * FROM DOLT_SCHEMA_DIFF($1, $2)`;
// PULLS

export const getCallMerge = (hasAuthor = false) =>
`CALL DOLT_MERGE($1, '--no-ff', '-m', $2${getAuthorNameString(hasAuthor, 3)})`;
`SELECT DOLT_MERGE($1, '--no-ff', '-m', $2${getAuthorNameString(hasAuthor, "$3")})`;

// TAGS

export const callDeleteTag = `CALL DOLT_TAG('-d', $1)`;
export const callDeleteTag = `SELECT DOLT_TAG('-d', $1)`;

export const getCallNewTag = (hasMessage = false, hasAuthor = false) =>
`CALL DOLT_TAG($1, $2${hasMessage ? `, '-m', $3` : ""}${getAuthorNameString(
`SELECT DOLT_TAG($1, $2${hasMessage ? `, '-m', $3` : ""}${getAuthorNameString(
hasAuthor,
hasMessage ? 4 : 3,
hasMessage ? "$4" : "$3",
)})`;

function getAuthorNameString(hasAuthor: boolean, n: number): string {
export function getAuthorNameString(hasAuthor: boolean, n: string): string {
if (!hasAuthor) return "";
return `, '--author', $${n}`;
return `, '--author', ${n}`;
}

// TODO: Columns
Expand Down
8 changes: 6 additions & 2 deletions graphql-server/src/queryFactory/postgres/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,12 @@ export class PostgresQueryFactory
return this.handleAsyncQuery(async qr => qr.createSchema(args.schemaName));
}

async checkoutDatabase(qr: QueryRunner, dbName: string): Promise<void> {
await qr.query(qh.setSearchPath(dbName, this.isDolt));
async checkoutDatabase(
qr: QueryRunner,
dbName: string,
refName?: string,
): Promise<void> {
await qr.query(qh.setSearchPath(dbName, refName, this.isDolt));
}

async getTableNames(args: t.RefArgs): Promise<string[]> {
Expand Down
12 changes: 10 additions & 2 deletions graphql-server/src/queryFactory/postgres/queries.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
export const setSearchPath = (dbName: string, _isDolt = false) =>
`SET SEARCH_PATH = '${dbName}'`;
export const setSearchPath = (
dbName: string,
refName?: string,
isDolt = false,
) => {
if (refName && isDolt) {
return `SET SEARCH_PATH = '${dbName}/${refName}'`;
}
return `SET SEARCH_PATH = '${dbName}'`;
};

export const databasesQuery = `SELECT datname FROM pg_database`;

Expand Down
12 changes: 11 additions & 1 deletion graphql-server/src/tables/upload.resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,17 @@ export class FileUploadResolver {
const qr = this.connResolver.connection().getQR();
const pgConnection = await qr.connect();

await pgConnection.query(setSearchPath(args.databaseName));
let isDolt = false;
try {
const res = await pgConnection.query("SELECT dolt_version()");
isDolt = !!res;
} catch (_) {
// ignore
}

await pgConnection.query(
setSearchPath(args.databaseName, args.refName, isDolt),
);

try {
await pipeline(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,7 @@ export default function NewConnection(props: Props) {
options={[
{ label: "MySQL/Dolt", value: DatabaseType.Mysql },
{
label: "Postgres",
// TODO(doltgres): Uncomment when ready
// label: "Postgres/Doltgres",
label: "Postgres/Doltgres",
value: DatabaseType.Postgres,
},
]}
Expand Down
7 changes: 3 additions & 4 deletions web/components/pageComponents/ConnectionsPage/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import MainLayout from "@components/layouts/MainLayout";
import DoltLink from "@components/links/DoltLink";
import DoltgresLink from "@components/links/DoltgresLink";
import { QueryHandler } from "@dolthub/react-components";
import {
DatabaseConnectionFragment,
Expand Down Expand Up @@ -41,10 +42,8 @@ export default function ConfigurationPage() {
<h1>Welcome to the Dolt Workbench</h1>
<p>
Connect the workbench to any MySQL or PostgreSQL compatible
database. Use <DoltLink />{" "}
{/* TODO(doltgres): Uncomment when ready */}
{/* or <DoltgresLink /> */}
to unlock version control features.
database. Use <DoltLink /> or <DoltgresLink /> to unlock version
control features.
</p>
</div>
<QueryHandler
Expand Down
2 changes: 1 addition & 1 deletion web/hooks/useDoltQueryBuilder/tests/testDataCommitDiff.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { sprintf } from "@dolthub/web-utils";
import { ColumnForDataTableFragment, CommitDiffType } from "@gen/graphql-types";
import { fakeCommitId } from "@hooks/useCommitListForBranch/mocks";
import { RequiredRefsParams, TableParams } from "@lib/params";
import { sprintf } from "@lib/sprintf";
import { Props } from "../useGetDoltCommitDiffQuery";
import { maybeConvertToPG } from "./utils";

Expand Down
2 changes: 1 addition & 1 deletion web/hooks/useDoltQueryBuilder/tests/testDataDiff.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { sprintf } from "@dolthub/web-utils";
import {
ColumnForDataTableFragment,
RowForDataTableFragment,
} from "@gen/graphql-types";
import { TableParams } from "@lib/params";
import { sprintf } from "@lib/sprintf";
import { Props } from "../useGetDoltDiffQuery";
import { maybeConvertToPG } from "./utils";

Expand Down
59 changes: 0 additions & 59 deletions web/lib/sprintf.test.ts

This file was deleted.

7 changes: 0 additions & 7 deletions web/lib/sprintf.ts

This file was deleted.

2 changes: 1 addition & 1 deletion web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
},
"dependencies": {
"@apollo/client": "^3.9.9",
"@dolthub/react-components": "^0.2.3",
"@dolthub/react-components": "^0.2.4",
"@dolthub/react-contexts": "^0.1.0",
"@dolthub/react-hooks": "^0.1.7",
"@dolthub/web-utils": "^0.1.8",
Expand Down
Loading

0 comments on commit 19c4a67

Please sign in to comment.