-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathperson_parsed_partiql.go
133 lines (110 loc) · 3.93 KB
/
person_parsed_partiql.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package main
import (
"context"
"errors"
"fmt"
"strings"
)
const (
SqlStatementTypeSelect StatementType = iota
SqlStatementTypeCreate
SqlStatementTypeInsert
SqlStatementTypeUpdate
SqlStatementTypeDelete
)
const (
PersonTableName = "Person"
)
var ErrNoDoltSqlEquivalent = errors.New("no Dolt Sql equivalent")
var doltSqlAddAndCommitWithMessageTemplate = "CALL DOLT_COMMIT('-Am', '%s');"
var doltSqlPersonTableInsertTemplate = "INSERT INTO Person (Id,FirstName,LastName,DOB,GovId,GovIdType,Address) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s');"
type StatementType int
type personParsedPartiQl struct {
st StatementType
stmt string
data []PersonData
revs []PersonRevision
}
var _ DoltParsedPartiQl = &personParsedPartiQl{}
func (d *personParsedPartiQl) addAndCommitDoltSql(ctx context.Context, message string) string {
return addAndCommitDoltSql(message)
}
func (d *personParsedPartiQl) formatDob(dob string) string {
// todo: format dob for dolt
return dob
}
func (d *personParsedPartiQl) getInsertPersonRowData(ctx context.Context) ([]PersonData, error) {
rows := make([]PersonData, len(d.revs))
// cheat and use the revisions
for idx, r := range d.revs {
rows[idx] = PersonData{
Id: r.Metadata.Id,
FirstName: r.Data.FirstName,
LastName: r.Data.LastName,
DOB: d.formatDob(r.Data.DOB),
GovId: r.Data.GovId,
GovIdType: r.Data.GovIdType,
Address: r.Data.Address,
}
}
return rows, nil
}
func (d *personParsedPartiQl) insertAsDoltSql(ctx context.Context, transactionId string) (string, error) {
insertStmt := ""
data, err := d.getInsertPersonRowData(ctx)
if err != nil {
return "", err
}
for _, person := range data {
insertStmt += fmt.Sprintf(doltSqlPersonTableInsertTemplate,
person.Id,
person.FirstName,
person.LastName,
d.formatDob(person.DOB),
person.GovId,
person.GovIdType,
person.Address)
insertStmt += "\n"
}
insertStmt += d.addAndCommitDoltSql(ctx, fmt.Sprintf("insert into %s, qldb transaction id: %s", PersonTableName, transactionId))
return insertStmt, nil
}
func (d *personParsedPartiQl) updateAsDoltSql(ctx context.Context, transactionId string) (string, error) {
// todo: handle updates
return "", ErrNoDoltSqlEquivalent
}
func (d *personParsedPartiQl) deleteAsDoltSql(ctx context.Context, transactionId string) (string, error) {
deleteStmt := ""
// todo: actually parse partiql
// cheat and just check against hardcoded first and last name
firstName := "Larry"
lastName := "David"
shouldDelete := false
if strings.Contains(d.stmt, firstName) && strings.Contains(d.stmt, lastName) {
shouldDelete = true
}
if !shouldDelete {
return "", ErrNoDoltSqlEquivalent
}
deleteStmt += fmt.Sprintf("DELETE FROM VehicleOwnership WHERE PersonIdFk = (SELECT p.Id FROM Person as p WHERE p.FirstName = '%s' AND p.LastName = '%s');", firstName, lastName) + "\n"
deleteStmt += fmt.Sprintf("DELETE FROM DriversLicense WHERE PersonIdFk = (SELECT p.Id FROM Person as p WHERE p.FirstName = '%s' AND p.LastName = '%s');", firstName, lastName) + "\n"
deleteStmt += fmt.Sprintf("DELETE FROM Person WHERE FirstName = '%s' AND LastName = '%s';", firstName, lastName) + "\n"
deleteStmt += d.addAndCommitDoltSql(ctx, fmt.Sprintf("delete from %s, %s, %s qldb transaction id: %s", VehicleOwnershipTableName, DriversLicenseTableName, PersonTableName, transactionId))
return deleteStmt, nil
}
func (d *personParsedPartiQl) AsDoltSql(ctx context.Context, transactionId string) (string, error) {
switch d.st {
case SqlStatementTypeSelect, SqlStatementTypeCreate:
return "", ErrNoDoltSqlEquivalent
case SqlStatementTypeInsert:
return d.insertAsDoltSql(ctx, transactionId)
case SqlStatementTypeUpdate:
return d.updateAsDoltSql(ctx, transactionId)
case SqlStatementTypeDelete:
return d.deleteAsDoltSql(ctx, transactionId)
}
return "", ErrNoDoltSqlEquivalent
}
func addAndCommitDoltSql(message string) string {
return fmt.Sprintf(doltSqlAddAndCommitWithMessageTemplate, message)
}