schema_builder.go 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package schema
  2. import (
  3. "sort"
  4. "github.com/seaweedfs/seaweedfs/weed/pb/schema_pb"
  5. )
  6. var (
  7. // Basic scalar types
  8. TypeBoolean = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_BOOL}}
  9. TypeInt32 = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_INT32}}
  10. TypeInt64 = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_INT64}}
  11. TypeFloat = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_FLOAT}}
  12. TypeDouble = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_DOUBLE}}
  13. TypeBytes = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_BYTES}}
  14. TypeString = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_STRING}}
  15. // Parquet logical types
  16. TypeTimestamp = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_TIMESTAMP}}
  17. TypeDate = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_DATE}}
  18. TypeDecimal = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_DECIMAL}}
  19. TypeTime = &schema_pb.Type{Kind: &schema_pb.Type_ScalarType{schema_pb.ScalarType_TIME}}
  20. )
  21. type RecordTypeBuilder struct {
  22. recordType *schema_pb.RecordType
  23. }
  24. // RecordTypeBegin creates a new RecordTypeBuilder, it should be followed by a series of WithField methods and RecordTypeEnd
  25. func RecordTypeBegin() *RecordTypeBuilder {
  26. return &RecordTypeBuilder{recordType: &schema_pb.RecordType{}}
  27. }
  28. // RecordTypeEnd finishes the building of a RecordValue
  29. func (rtb *RecordTypeBuilder) RecordTypeEnd() *schema_pb.RecordType {
  30. // be consistent with parquet.node.go `func (g Group) Fields() []Field`
  31. sort.Slice(rtb.recordType.Fields, func(i, j int) bool {
  32. return rtb.recordType.Fields[i].Name < rtb.recordType.Fields[j].Name
  33. })
  34. return rtb.recordType
  35. }
  36. // NewRecordTypeBuilder creates a new RecordTypeBuilder from an existing RecordType, it should be followed by a series of WithField methods and RecordTypeEnd
  37. func NewRecordTypeBuilder(recordType *schema_pb.RecordType) (rtb *RecordTypeBuilder) {
  38. return &RecordTypeBuilder{recordType: recordType}
  39. }
  40. func (rtb *RecordTypeBuilder) WithField(name string, scalarType *schema_pb.Type) *RecordTypeBuilder {
  41. rtb.recordType.Fields = append(rtb.recordType.Fields, &schema_pb.Field{
  42. Name: name,
  43. Type: scalarType,
  44. })
  45. return rtb
  46. }
  47. func (rtb *RecordTypeBuilder) WithRecordField(name string, recordType *schema_pb.RecordType) *RecordTypeBuilder {
  48. rtb.recordType.Fields = append(rtb.recordType.Fields, &schema_pb.Field{
  49. Name: name,
  50. Type: &schema_pb.Type{Kind: &schema_pb.Type_RecordType{RecordType: recordType}},
  51. })
  52. return rtb
  53. }
  54. func ListOf(elementType *schema_pb.Type) *schema_pb.Type {
  55. return &schema_pb.Type{Kind: &schema_pb.Type_ListType{ListType: &schema_pb.ListType{ElementType: elementType}}}
  56. }