12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package schema
- import (
- "fmt"
- "github.com/seaweedfs/seaweedfs/weed/pb/schema_pb"
- )
- type ParquetLevels struct {
- startColumnIndex int
- endColumnIndex int
- definitionDepth int
- levels map[string]*ParquetLevels
- }
- func ToParquetLevels(recordType *schema_pb.RecordType) (*ParquetLevels, error) {
- return toRecordTypeLevels(recordType, 0, 0)
- }
- func toFieldTypeLevels(fieldType *schema_pb.Type, startColumnIndex, definitionDepth int) (*ParquetLevels, error) {
- switch fieldType.Kind.(type) {
- case *schema_pb.Type_ScalarType:
- return toFieldTypeScalarLevels(fieldType.GetScalarType(), startColumnIndex, definitionDepth)
- case *schema_pb.Type_RecordType:
- return toRecordTypeLevels(fieldType.GetRecordType(), startColumnIndex, definitionDepth)
- case *schema_pb.Type_ListType:
- return toFieldTypeListLevels(fieldType.GetListType(), startColumnIndex, definitionDepth)
- }
- return nil, fmt.Errorf("unknown field type: %T", fieldType.Kind)
- }
- func toFieldTypeListLevels(listType *schema_pb.ListType, startColumnIndex, definitionDepth int) (*ParquetLevels, error) {
- return toFieldTypeLevels(listType.ElementType, startColumnIndex, definitionDepth)
- }
- func toFieldTypeScalarLevels(scalarType schema_pb.ScalarType, startColumnIndex, definitionDepth int) (*ParquetLevels, error) {
- return &ParquetLevels{
- startColumnIndex: startColumnIndex,
- endColumnIndex: startColumnIndex + 1,
- definitionDepth: definitionDepth,
- }, nil
- }
- func toRecordTypeLevels(recordType *schema_pb.RecordType, startColumnIndex, definitionDepth int) (*ParquetLevels, error) {
- recordTypeLevels := &ParquetLevels{
- startColumnIndex: startColumnIndex,
- definitionDepth: definitionDepth,
- levels: make(map[string]*ParquetLevels),
- }
- for _, field := range recordType.Fields {
- fieldTypeLevels, err := toFieldTypeLevels(field.Type, startColumnIndex, definitionDepth+1)
- if err != nil {
- return nil, err
- }
- recordTypeLevels.levels[field.Name] = fieldTypeLevels
- startColumnIndex = fieldTypeLevels.endColumnIndex
- }
- recordTypeLevels.endColumnIndex = startColumnIndex
- return recordTypeLevels, nil
- }
|