Skip to content

Commit

Permalink
Implement schema level support (#296)
Browse files Browse the repository at this point in the history
* feat: add schema support for resource management on standard and view table

* feat: add auto create schema for view table

* chore: fix lint error
  • Loading branch information
WantToBePro31 authored Nov 7, 2024
1 parent 33a350a commit 32efc8d
Show file tree
Hide file tree
Showing 12 changed files with 690 additions and 189 deletions.
15 changes: 10 additions & 5 deletions ext/store/maxcompute/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,24 @@ func NewClient(svcAccount string) (*MaxComputeClient, error) {

aliAccount := account.NewAliyunAccount(cred.AccessID, cred.AccessKey)
odpsIns := odps.NewOdps(aliAccount, cred.Endpoint)
odpsIns.SetDefaultProjectName(cred.ProjectName)

return &MaxComputeClient{odpsIns}, nil
}

func (c *MaxComputeClient) TableHandleFrom() TableResourceHandle {
func (c *MaxComputeClient) TableHandleFrom(projectSchema ProjectSchema) TableResourceHandle {
c.SetDefaultProjectName(projectSchema.Project)
c.SetCurrentSchemaName(projectSchema.Schema)
s := c.Schemas()
t := c.Tables()
return NewTableHandle(c, &t)
return NewTableHandle(c, s, t)
}

func (c *MaxComputeClient) ViewHandleFrom() TableResourceHandle {
func (c *MaxComputeClient) ViewHandleFrom(projectSchema ProjectSchema) TableResourceHandle {
c.SetDefaultProjectName(projectSchema.Project)
c.SetCurrentSchemaName(projectSchema.Schema)
s := c.Schemas()
t := c.Tables()
return NewViewHandle(c, &t)
return NewViewHandle(c, s, t)
}

func collectMaxComputeCredential(jsonData []byte) (*maxComputeCredentials, error) {
Expand Down
10 changes: 8 additions & 2 deletions ext/store/maxcompute/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ func TestMaxComputeClient(t *testing.T) {
client, err := maxcompute.NewClient(testCredJSON)
assert.Nil(t, err)

tableHandle := client.TableHandleFrom()
projectSchema, err := maxcompute.ProjectSchemaFrom("proj", "schema")
assert.Nil(t, err)

tableHandle := client.TableHandleFrom(projectSchema)
assert.NotNil(t, tableHandle)
})
})
Expand All @@ -44,7 +47,10 @@ func TestMaxComputeClient(t *testing.T) {
client, err := maxcompute.NewClient(testCredJSON)
assert.Nil(t, err)

viewHandle := client.ViewHandleFrom()
projectSchema, err := maxcompute.ProjectSchemaFrom("proj", "schema")
assert.Nil(t, err)

viewHandle := client.ViewHandleFrom(projectSchema)
assert.NotNil(t, viewHandle)
})
})
Expand Down
45 changes: 29 additions & 16 deletions ext/store/maxcompute/maxcompute.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ const (
store = "MaxComputeStore"

maxcomputeID = "maxcompute"

TableNameSections = 3
)

type ResourceHandle interface {
Expand All @@ -32,8 +30,8 @@ type TableResourceHandle interface {
}

type Client interface {
TableHandleFrom() TableResourceHandle
ViewHandleFrom() TableResourceHandle
TableHandleFrom(projectSchema ProjectSchema) TableResourceHandle
ViewHandleFrom(projectSchema ProjectSchema) TableResourceHandle
}

type ClientProvider interface {
Expand Down Expand Up @@ -63,25 +61,30 @@ func (m MaxCompute) Create(ctx context.Context, res *resource.Resource) error {
return err
}

projectSchema, _, err := getCompleteComponentName(res)
if err != nil {
return err
}

switch res.Kind() {
case KindTable:
handle := odpsClient.TableHandleFrom()
handle := odpsClient.TableHandleFrom(projectSchema)
return handle.Create(res)

case KindView:
handle := odpsClient.ViewHandleFrom()
handle := odpsClient.ViewHandleFrom(projectSchema)
return handle.Create(res)

default:
return errors.InvalidArgument(store, "invalid kind for maxcompute resource "+res.Kind())
}
}

func (m MaxCompute) Update(ctx context.Context, resource *resource.Resource) error {
func (m MaxCompute) Update(ctx context.Context, res *resource.Resource) error {
spanCtx, span := startChildSpan(ctx, "maxcompute/UpdateResource")
defer span.End()

account, err := m.secretProvider.GetSecret(spanCtx, resource.Tenant(), accountKey)
account, err := m.secretProvider.GetSecret(spanCtx, res.Tenant(), accountKey)
if err != nil {
return err
}
Expand All @@ -91,17 +94,22 @@ func (m MaxCompute) Update(ctx context.Context, resource *resource.Resource) err
return err
}

switch resource.Kind() {
projectSchema, _, err := getCompleteComponentName(res)
if err != nil {
return err
}

switch res.Kind() {
case KindTable:
handle := odpsClient.TableHandleFrom()
return handle.Update(resource)
handle := odpsClient.TableHandleFrom(projectSchema)
return handle.Update(res)

case KindView:
handle := odpsClient.ViewHandleFrom()
return handle.Update(resource)
handle := odpsClient.ViewHandleFrom(projectSchema)
return handle.Update(res)

default:
return errors.InvalidArgument(store, "invalid kind for maxcompute resource "+resource.Kind())
return errors.InvalidArgument(store, "invalid kind for maxcompute resource "+res.Kind())
}
}

Expand Down Expand Up @@ -164,7 +172,12 @@ func (m MaxCompute) Exist(ctx context.Context, tnnt tenant.Tenant, urn resource.
return false, err
}

kindToHandleFn := map[string]func() TableResourceHandle{
projectSchema, err := ProjectSchemaFor(name)
if err != nil {
return false, err
}

kindToHandleFn := map[string]func(projectSchema ProjectSchema) TableResourceHandle{
KindTable: client.TableHandleFrom,
KindView: client.ViewHandleFrom,
}
Expand All @@ -175,7 +188,7 @@ func (m MaxCompute) Exist(ctx context.Context, tnnt tenant.Tenant, urn resource.
return true, err
}

if resourceHandleFn().Exists(resourceName) {
if resourceHandleFn(projectSchema).Exists(resourceName) {
return true, nil
}
}
Expand Down
Loading

0 comments on commit 32efc8d

Please sign in to comment.