odps/function.go (221 lines of code) (raw):
package odps
import (
"encoding/xml"
"net/url"
"time"
"github.com/pkg/errors"
"github.com/aliyun/aliyun-odps-go-sdk/odps/common"
"github.com/aliyun/aliyun-odps-go-sdk/odps/restclient"
)
// Function is a function
type Function struct {
ProjectName string
beLoaded bool
OdpsIns *Odps
Model functionModel
}
type functionModel struct {
XMLName xml.Name `xml:"Function"`
SchemaName string `xml:"SchemaName,omitempty"`
Name string `xml:"Alias,omitempty"`
Owner string `xml:"Owner,omitempty"`
CreationTime string `xml:"CreationTime,omitempty"`
ClassPath string `xml:"ClassType,omitempty"`
Resources []FResource `xml:"Resources,omitempty"`
IsSQLFunction bool `xml:"IsSqlFunction,omitempty"`
SQLDefinitionText string `xml:"SqlDefinitionText,omitempty"`
IsEmbeddedFunction bool `xml:"IsEmbeddedFunction,omitempty"`
ProgramLanguage string `xml:"ProgramLanguage,omitempty"`
Code string `xml:"Code,omitempty"`
FileName string `xml:"FileName,omitempty"`
}
// FResource is a resource for function
type FResource struct {
ResourceName string `xml:"ResourceName,omitempty"`
}
// Load function meta from MaxCompute
func (f *Function) Load() error {
rb := common.NewResourceBuilder(f.ProjectName)
resource := rb.Function(f.Name())
queryArgs := make(url.Values, 4)
if f.SchemaName() != "" {
queryArgs.Set("curr_schema", f.SchemaName())
}
client := f.OdpsIns.restClient
err := client.GetWithModel(resource, queryArgs, nil, &f.Model)
if err != nil {
return errors.WithStack(err)
}
f.beLoaded = true
return nil
}
// Exist check if the function exists
func (f *Function) Exist() (bool, error) {
err := f.Load()
var httpErr restclient.HttpError
if errors.As(err, &httpErr) {
if httpErr.Status == "404 Not Found" {
return false, nil
}
return false, err
}
return true, nil
}
// Name get function name
func (f *Function) Name() string {
return f.Model.Name
}
// SetName set function name
func (f *Function) SetName(name string) {
f.Model.Name = name
}
// Owner get function owner
func (f *Function) Owner() string {
return f.Model.Owner
}
// CreationTime get function creation time
func (f *Function) CreationTime() time.Time {
date, _ := common.ParseRFC1123Date(f.Model.CreationTime)
return date
}
// ClassPath get function class path
func (f *Function) ClassPath() string {
return f.Model.ClassPath
}
// SetClassPath set function class path
func (f *Function) SetClassPath(classPath string) {
f.Model.ClassPath = classPath
}
// Resources get function resources
func (f *Function) Resources() []string {
if f.Model.Resources == nil {
return nil
}
var resources []string
for i := range f.Model.Resources {
resources = append(resources, f.Model.Resources[i].ResourceName)
}
return resources
}
// SetResources set function resources
func (f *Function) SetResources(resources []string) {
if resources == nil {
return
}
var fResources []FResource
for i := range resources {
fResources = append(fResources, FResource{ResourceName: resources[i]})
}
f.Model.Resources = fResources
}
// Project get function project
func (f *Function) Project() string {
return f.ProjectName
}
// SchemaName get function schema name
func (f *Function) SchemaName() string {
return f.Model.SchemaName
}
// IsSQLFunction get whether function is sql function
func (f *Function) IsSQLFunction() bool {
return f.Model.IsSQLFunction
}
// SQLDefinitionText get function sql definition text
func (f *Function) SQLDefinitionText() string {
return f.Model.SQLDefinitionText
}
// IsEmbeddedFunction get whether function is embedded function
func (f *Function) IsEmbeddedFunction() bool {
return f.Model.IsEmbeddedFunction
}
// ProgramLanguage get function program language
func (f *Function) ProgramLanguage() string {
return f.Model.ProgramLanguage
}
// Code get function code
func (f *Function) Code() string {
return f.Model.Code
}
// FunctionBuilder is a builder for Function
type FunctionBuilder struct {
schemaName string
name string
owner string
creationTime string
classPath string
resources []FResource
isSQLFunction bool
sqlDefinitionText string
isEmbeddedFunction bool
programLanguage string
code string
fileName string
projectName string
odpsIns *Odps
}
// NewFunctionBuilder create a new FunctionBuilder
func NewFunctionBuilder() *FunctionBuilder {
return &FunctionBuilder{}
}
// Name set function name
func (fb *FunctionBuilder) Name(name string) *FunctionBuilder {
fb.name = name
return fb
}
// SchemaName set function schema name
func (fb *FunctionBuilder) SchemaName(schemaName string) *FunctionBuilder {
fb.schemaName = schemaName
return fb
}
// Owner set function owner
func (fb *FunctionBuilder) Owner(owner string) *FunctionBuilder {
fb.owner = owner
return fb
}
// CreationTime set function creation time
func (fb *FunctionBuilder) CreationTime(creationTime common.GMTTime) *FunctionBuilder {
fb.creationTime = creationTime.String()
return fb
}
// ClassPath set function class path
func (fb *FunctionBuilder) ClassPath(classPath string) *FunctionBuilder {
fb.classPath = classPath
return fb
}
// Resources set function resources
func (fb *FunctionBuilder) Resources(resources []string) *FunctionBuilder {
if resources == nil {
return fb
}
var fResources []FResource
for i := range resources {
fResources = append(fResources, FResource{ResourceName: resources[i]})
}
fb.resources = fResources
return fb
}
// IsSQLFunction set whether function is sql function
func (fb *FunctionBuilder) IsSQLFunction(isSQLFunction bool) *FunctionBuilder {
fb.isSQLFunction = isSQLFunction
return fb
}
// SQLDefinitionText set function sql definition text
func (fb *FunctionBuilder) SQLDefinitionText(sqlDefinitionText string) *FunctionBuilder {
fb.sqlDefinitionText = sqlDefinitionText
return fb
}
// IsEmbeddedFunction set whether function is embedded function
func (fb *FunctionBuilder) IsEmbeddedFunction(isEmbeddedFunction bool) *FunctionBuilder {
fb.isEmbeddedFunction = isEmbeddedFunction
return fb
}
// ProgramLanguage set function program language
func (fb *FunctionBuilder) ProgramLanguage(programLanguage string) *FunctionBuilder {
fb.programLanguage = programLanguage
return fb
}
// Code set function code
func (fb *FunctionBuilder) Code(code string) *FunctionBuilder {
fb.code = code
return fb
}
// FileName set function file name
func (fb *FunctionBuilder) FileName(fileName string) *FunctionBuilder {
fb.fileName = fileName
return fb
}
// ProjectName set function project name
func (fb *FunctionBuilder) ProjectName(projectName string) *FunctionBuilder {
fb.projectName = projectName
return fb
}
// Odps set function odps
func (fb *FunctionBuilder) Odps(odpsIns *Odps) *FunctionBuilder {
fb.odpsIns = odpsIns
return fb
}
// Build build a Function
func (fb *FunctionBuilder) Build() Function {
return Function{
ProjectName: fb.projectName,
OdpsIns: fb.odpsIns,
Model: functionModel{
SchemaName: fb.schemaName,
Name: fb.name,
Owner: fb.owner,
CreationTime: fb.creationTime,
ClassPath: fb.classPath,
Resources: fb.resources,
IsSQLFunction: fb.isSQLFunction,
SQLDefinitionText: fb.sqlDefinitionText,
IsEmbeddedFunction: fb.isEmbeddedFunction,
ProgramLanguage: fb.programLanguage,
Code: fb.code,
FileName: fb.fileName,
},
}
}