gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/modifyx/modify-object.go (about)

     1  package modifyx
     2  
     3  import (
     4  	"gitee.com/zhongguo168a/gocodes/datax/convertx"
     5  )
     6  
     7  // 新建一个对象
     8  func NewObject(root *Root) (obj *Object) {
     9  	obj = newObject()
    10  	obj.root = root
    11  	return
    12  }
    13  
    14  func newObject() (obj *Object) {
    15  	obj = &Object{}
    16  	obj.temps = map[string]interface{}{}
    17  	return
    18  }
    19  
    20  // 修正对象
    21  // 如果需要在运行时,替换源的数据,可通过设置runtime实现
    22  type Object struct {
    23  	root *Root
    24  	// 字段的路径
    25  	path string
    26  	// 在父对象中的字段名字
    27  	field string
    28  	// 缓存的map/array/struct等对象, 避免重复创建对象
    29  	temps map[string]interface{}
    30  	//
    31  	creators map[string]func(obj IObject) IObject
    32  	creator  func(obj IObject) IObject
    33  }
    34  
    35  func (s *Object) RefClassCreator(field string, creator func(object IObject) IObject) {
    36  	if s.creators == nil {
    37  		s.creators = map[string]func(obj IObject) IObject{}
    38  	}
    39  	s.creators[field] = creator
    40  }
    41  
    42  func (s *Object) RefOriginBool(field string) bool {
    43  	return convertx.AnyToBool(s.root.source.GetOrigin(s.path + "/" + field))
    44  }
    45  
    46  func (s *Object) RefOriginFloat(field string) float64 {
    47  	return convertx.AnyToFloat64(s.root.source.GetOrigin(s.path + "/" + field))
    48  }
    49  func (s *Object) RefOriginInt(field string) int {
    50  	return convertx.AnyToInt(s.root.source.GetOrigin(s.path + "/" + field))
    51  }
    52  
    53  func (s *Object) RefAnyType() string {
    54  	return convertx.AnyToString(s.root.source.GetOrigin(s.path + "/_type"))
    55  }
    56  
    57  func (s *Object) Dispose() {
    58  	s.temps = nil
    59  	s.root = nil
    60  }
    61  
    62  // 修正后的整型
    63  func (s *Object) RefInt(field string) int {
    64  	root := s.root
    65  	return convertx.AnyToInt(root.source.Get(root.ctx, s.path+"/"+field))
    66  
    67  }
    68  
    69  // 修正后的整型
    70  func (s *Object) RefBool(field string) bool {
    71  	root := s.root
    72  	return convertx.AnyToBool(root.source.Get(root.ctx, s.path+"/"+field))
    73  }
    74  
    75  // 修正后的浮点型
    76  func (s *Object) RefFloat64(field string) float64 {
    77  	root := s.root
    78  	return convertx.AnyToFloat64(root.source.Get(root.ctx, s.path+"/"+field))
    79  
    80  }
    81  
    82  // 获取原始数据指定的字段
    83  func (s *Object) RefOrigin(field string) interface{} {
    84  	return s.root.source.GetOrigin(field)
    85  }
    86  
    87  func (s *Object) RefUint(field string) (val uint) {
    88  	return uint(s.RefInt(field))
    89  }
    90  
    91  func (s *Object) RefString(field string) (val string) {
    92  	root := s.root
    93  	return convertx.AnyToString(root.source.Get(root.ctx, s.path+"/"+field))
    94  }
    95  func (s *Object) RefAny(field string) (val interface{}) {
    96  	return s.RefObject(field)
    97  }
    98  func (s *Object) RefArray(field string) (r IArray) {
    99  	iobj, hastemp := s.temps[field]
   100  	if hastemp == false {
   101  		obj := newArray()
   102  		obj.root = s.root
   103  		obj.path = s.path + "/" + field
   104  		obj.creator = s.creators[field]
   105  		//
   106  		iobj = obj
   107  		s.temps[field] = iobj
   108  	}
   109  
   110  	r = iobj.(IArray)
   111  	return
   112  }
   113  
   114  func (s *Object) RefMap(field string) (r IObject) {
   115  	iobj, hastemp := s.temps[field]
   116  	if hastemp == false {
   117  		obj := newObject()
   118  		obj.root = s.root
   119  		obj.field = field
   120  		obj.path = s.path + "/" + field
   121  		obj.temps = map[string]interface{}{}
   122  		//
   123  		creator, hascreator := s.creators[field]
   124  		if hascreator {
   125  			obj.creator = creator
   126  		}
   127  		iobj = obj
   128  		s.temps[field] = iobj
   129  	}
   130  
   131  	r = iobj.(IObject)
   132  	return
   133  }
   134  
   135  func (s *Object) RefObject(field string) (r IObject) {
   136  	iobj, hastemp := s.temps[field]
   137  	if hastemp == false {
   138  		obj := newObject()
   139  		obj.root = s.root
   140  		obj.field = field
   141  		obj.path = s.path + "/" + field
   142  		obj.temps = map[string]interface{}{}
   143  
   144  		if s.creator != nil { // 只有map对象会有此属性
   145  			iobj = s.creator(obj)
   146  		} else {
   147  			//
   148  			creator, hascreator := s.creators[field]
   149  			if !hascreator {
   150  				if obj.RefAnyType() != "" {
   151  					creator = getType(obj.RefAnyType())
   152  					if creator != nil {
   153  						iobj = creator(obj)
   154  					} else {
   155  						iobj = obj
   156  					}
   157  				} else {
   158  					iobj = obj
   159  				}
   160  			} else {
   161  				iobj = creator(obj)
   162  			}
   163  		}
   164  
   165  		s.temps[field] = iobj
   166  	}
   167  
   168  	r = iobj.(IObject)
   169  	return
   170  }
   171  
   172  func (s *Object) RefIsNil() bool {
   173  	source := s.root.source
   174  	return source.IsNil(s.path)
   175  }
   176  
   177  func (s *Object) RefLength() int {
   178  	source := s.root.source
   179  	return source.Length(s.path)
   180  }
   181  
   182  func (s *Object) RefKeys() (r []string) {
   183  	if s.RefIsNil() {
   184  		return
   185  	}
   186  
   187  	source := s.root.source
   188  	return source.MapKeys(s.path)
   189  }