12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package datahub
- import (
- "encoding/json"
- "fmt"
- )
- type Field struct {
- Name string `json:"name"`
- Type FieldType `json:"type"`
- AllowNull bool `json:"notnull"`
- Comment string `json:"comment"`
- }
- // RecordSchema
- type RecordSchema struct {
- Fields []Field `json:"fields"`
- }
- // NewRecordSchema create a new record schema for tuple record
- func NewRecordSchema() *RecordSchema {
- return &RecordSchema{
- Fields: make([]Field, 0, 0),
- }
- }
- func NewRecordSchemaFromJson(SchemaJson string) (recordSchema *RecordSchema, err error) {
- recordSchema = &RecordSchema{}
- if err = json.Unmarshal([]byte(SchemaJson), recordSchema); err != nil {
- return
- }
- for _, v := range recordSchema.Fields {
- if !validateFieldType(v.Type) {
- panic(fmt.Sprintf("field type %q illegal", v.Type))
- }
- }
- return
- }
- func (rs *RecordSchema) String() string {
- type FieldHelper struct {
- Name string `json:"name"`
- Type FieldType `json:"type"`
- NotNull bool `json:"notnull,omitempty"`
- Comment string `json:"comment,omitempty"`
- }
- fields := make([]FieldHelper, 0, rs.Size())
- for _, field := range rs.Fields {
- tmpField := FieldHelper{field.Name, field.Type, !field.AllowNull, field.Comment}
- fields = append(fields, tmpField)
- }
- tmpSchema := struct {
- Fields []FieldHelper `json:"fields"`
- }{fields}
- buf, _ := json.Marshal(tmpSchema)
- return string(buf)
- }
- // AddField add a field
- func (rs *RecordSchema) AddField(f Field) *RecordSchema {
- if !validateFieldType(f.Type) {
- panic(fmt.Sprintf("field type %q illegal", f.Type))
- }
- for _, v := range rs.Fields {
- if v.Name == f.Name {
- panic(fmt.Sprintf("field %q duplicated", f.Name))
- }
- }
- rs.Fields = append(rs.Fields, f)
- return rs
- }
- // GetFieldIndex get index of given field
- func (rs *RecordSchema) GetFieldIndex(fname string) int {
- for idx, v := range rs.Fields {
- if fname == v.Name {
- return idx
- }
- }
- return -1
- }
- // Size get record schema fields size
- func (rs *RecordSchema) Size() int {
- return len(rs.Fields)
- }
- type RecordSchemaInfo struct {
- VersionId int `json:"VersionId"`
- RecordSchema RecordSchema `json:"RecordSchema"`
- }
|