in odps/table.go [627:706]
func (t *Table) getPartitions(partitionSpec string) ([]Partition, error) {
queryArgs := make(url.Values, 4)
queryArgs.Set("partitions", "")
queryArgs.Set("expectmarker", "true")
queryArgs.Set("maxitems", "10000")
if partitionSpec != "" {
queryArgs.Set("partition", partitionSpec)
}
if t.SchemaName() != "" {
queryArgs.Set("curr_schema", t.SchemaName())
}
resource := t.ResourceUrl()
client := t.odpsIns.restClient
type ResModel struct {
XMLName xml.Name `xml:"Partitions"`
Marker string
MaxItems string
Partitions []struct {
Columns []struct {
Name string `xml:"Name,attr"`
Value string `xml:"Value,attr"`
} `xml:"Column"`
CreationTime int64
LastDDLTime int64
LastModifiedTime int64
PartitionSize int
PartitionRecordCount int
} `xml:"Partition"`
}
var resModel ResModel
var partitions []Partition
for {
err := client.GetWithModel(resource, queryArgs, nil, &resModel)
if err != nil {
return partitions, errors.WithStack(err)
}
var pModel partitionModel
for _, p := range resModel.Partitions {
pModel.Value = make([]PartitionColumn, len(p.Columns))
for i, c := range p.Columns {
pModel.Value[i] = PartitionColumn{
Name: c.Name,
Value: c.Value,
}
}
pModel.CreateTime = common.GMTTime(time.Unix(p.CreationTime, 0))
pModel.LastDDLTime = common.GMTTime(time.Unix(p.LastDDLTime, 0))
pModel.LastModifiedTime = common.GMTTime(time.Unix(p.LastModifiedTime, 0))
pModel.PartitionSize = p.PartitionSize
pModel.PartitionRecordNum = p.PartitionRecordCount
partition := Partition{
odpsIns: t.odpsIns,
projectName: t.ProjectName(),
schemaName: t.SchemaName(),
tableName: t.Name(),
model: pModel,
}
partitions = append(partitions, partition)
}
if resModel.Marker != "" {
queryArgs.Set("marker", resModel.Marker)
resModel = ResModel{}
} else {
break
}
}
return partitions, nil
}