func()

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
}