Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[breaking change]Support multi-col primary key #38

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require (
github.com/gin-gonic/gin v1.9.1
github.com/google/uuid v1.4.0
github.com/stretchr/testify v1.8.4
github.com/xdblab/xdb-apis v0.0.2-0.20231109205241-83a802654b63
github.com/xdblab/xdb-apis v0.0.2-0.20231110052405-627a5e03953e
)

require (
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
github.com/xdblab/xdb-apis v0.0.2-0.20231109205241-83a802654b63 h1:HFQdLRxmMAp3WLqVoZzDxjhxqLD5Yxm1/1JRwLHG9S0=
github.com/xdblab/xdb-apis v0.0.2-0.20231109205241-83a802654b63/go.mod h1:+qLBKhgz/BYatlFAYsXmiCvKM3yFA4dld78LClXPyO8=
github.com/xdblab/xdb-apis v0.0.2-0.20231110052405-627a5e03953e h1:MaJkZzdBHJnDovYGkp6f3G8M9zYxiEysRHr1d3bnQBY=
github.com/xdblab/xdb-apis v0.0.2-0.20231110052405-627a5e03953e/go.mod h1:+qLBKhgz/BYatlFAYsXmiCvKM3yFA4dld78LClXPyO8=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
Expand Down
35 changes: 27 additions & 8 deletions xdb/client_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,10 +160,30 @@ func (c *clientImpl) convertToTableConfig(
if !ok {
return nil, NewInvalidArgumentError("GlobalAttributeConfig.DBTableConfigs missing table: " + tblName)
}
dbVal, err := c.dbConverter.ToDBValue(cfg.PKValue, cfg.PKHint)
if err != nil {
return nil, err

// convert for primary key
var originPKValues []interface{}
if len(tbl.PrimaryKeyNames) == 1 {
originPKValues = []interface{}{cfg.PKValue}
} else {
originPKValues = cfg.MultiColumnPKValues
}

dbVals := make([]xdbapi.TableColumnValue, len(tbl.PrimaryKeyNames))
for i := range tbl.PrimaryKeyNames {
pkName := tbl.PrimaryKeyNames[i]
hint := tbl.PrimaryKeyHints[i]
dbVal, err := c.dbConverter.ToDBValue(originPKValues[i], hint)
if err != nil {
return nil, err
}
dbVals[i] = xdbapi.TableColumnValue{
DbColumn: pkName,
DbQueryValue: dbVal,
}
}

// convert for initial attributes
var initWrite []xdbapi.TableColumnValue
for key, attr := range cfg.InitialAttributes {
def, ok := keyToDefs[key]
Expand All @@ -179,12 +199,11 @@ func (c *clientImpl) convertToTableConfig(
DbQueryValue: dbVal,
})
}

// assemble for the config
tblConfig := xdbapi.GlobalAttributeTableConfig{
TableName: tblName,
PrimaryKey: xdbapi.TableColumnValue{
DbColumn: tbl.PK,
DbQueryValue: dbVal,
},
TableName: tblName,
PrimaryKey: dbVals,
InitialWrite: initWrite,
InitialWriteMode: cfg.InitialWriteConflictMode,
}
Expand Down
42 changes: 38 additions & 4 deletions xdb/persistence_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ type GlobalAttributesSchema struct {
}

type DBTableSchema struct {
TableName string
PK string
Columns []DBColumnDef
TableName string
PrimaryKeyNames []string
PrimaryKeyHints []*DBHint
Columns []DBColumnDef
// DefaultTablePolicy is the default loading policy for this table
DefaultTablePolicy TablePolicy
}
Expand Down Expand Up @@ -124,6 +125,38 @@ func NewDBTableSchema(
defaultReadLocking xdbapi.TableReadLockingPolicy,
columns ...DBColumnDef,
) DBTableSchema {
return NewDBTableSchemaWithPKHint(tableName, pk, nil, defaultReadLocking, columns...)
}

func NewDBTableSchemaMultiColumnPK(
tableName string,
pks []string,
defaultReadLocking xdbapi.TableReadLockingPolicy,
columns ...DBColumnDef,
) DBTableSchema {
return NewDBTableSchemaMultiColumnPKWithPKHint(tableName, pks, make([]*DBHint, len(pks)),
defaultReadLocking, columns...)
}

func NewDBTableSchemaWithPKHint(
tableName string,
pk string, pkHint *DBHint,
defaultReadLocking xdbapi.TableReadLockingPolicy,
columns ...DBColumnDef,
) DBTableSchema {
return NewDBTableSchemaMultiColumnPKWithPKHint(tableName, []string{pk}, []*DBHint{pkHint},
defaultReadLocking, columns...)
}

func NewDBTableSchemaMultiColumnPKWithPKHint(
tableName string,
pks []string, pkHints []*DBHint,
defaultReadLocking xdbapi.TableReadLockingPolicy,
columns ...DBColumnDef,
) DBTableSchema {
if len(pks) != len(pkHints) {
panic("pks and pkHints must have the same length")
}

var loadingKeys []string
for _, col := range columns {
Expand All @@ -136,7 +169,8 @@ func NewDBTableSchema(

return DBTableSchema{
TableName: tableName,
PK: pk,
PrimaryKeyNames: pks,
PrimaryKeyHints: pkHints,
Columns: columns,
DefaultTablePolicy: defaultPolicy,
}
Expand Down
6 changes: 4 additions & 2 deletions xdb/persistence_schema_validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@ func (s PersistenceSchema) ValidateForRegistry() (map[string]internalGlobalAttrD
if tableSchema.TableName == "" {
return nil, nil, NewProcessDefinitionError("GlobalAttributeSchema.Tables.TableName is empty")
}
if tableSchema.PK == "" {
return nil, nil, NewProcessDefinitionError("GlobalAttributeSchema.Tables.PK is empty")
for _, name := range tableSchema.PrimaryKeyNames {
if name == "" {
return nil, nil, NewProcessDefinitionError("GlobalAttributeSchema.Tables.PK is empty")
}
}
for _, colDef := range tableSchema.Columns {
if colDef.ColumnName == "" {
Expand Down
3 changes: 2 additions & 1 deletion xdb/process_start_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ func NewGlobalAttributeOptions(
type DBTableConfig struct {
TableName string
PKValue interface{}
PKHint *DBHint
// MultiColumnPKValues is needed for multi-column primary key
MultiColumnPKValues []interface{}
// InitialAttributes is the initial attributes to be set when starting the process execution
// Key is the attribute key, value is the attribute value
InitialAttributes map[string]interface{}
Expand Down
Loading