gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/schemax/configs/ConfigTree.go (about)

     1  package configs
     2  
     3  import (
     4  	"gitee.com/zhongguo168a/gocodes/datax"
     5  	"gitee.com/zhongguo168a/gocodes/datax/listx"
     6  	"gitee.com/zhongguo168a/gocodes/datax/mapx"
     7  	"gitee.com/zhongguo168a/gocodes/datax/schemax"
     8  	"gitee.com/zhongguo168a/gocodes/datax/treex"
     9  	"strings"
    10  )
    11  
    12  func NewConfigTree() (obj *ConfigTree) {
    13  	obj = &ConfigTree{}
    14  	obj.datas = listx.NewList()
    15  	return
    16  }
    17  
    18  type ConfigTree struct {
    19  	datas *listx.List
    20  }
    21  
    22  func (set *ConfigTree) L列表() *listx.List {
    23  	return set.datas
    24  }
    25  
    26  func (set *ConfigTree) ToConfigMap(existed *ConfigMap) *ConfigMap {
    27  	if existed == nil {
    28  		existed = NewConfigMap()
    29  	}
    30  
    31  	list := set.L列表()
    32  	for _, val := range list.Slice() {
    33  		c := val.(*ConfigTreeItem)
    34  
    35  		var 数据 map[string]interface{}
    36  		i数据 := c.S数据()
    37  		if i数据 == nil {
    38  			数据 = map[string]interface{}{}
    39  		} else {
    40  			数据 = mapx.CloneMap(i数据)
    41  		}
    42  		数据["_type"] = c.L类型
    43  		数据["_catalog"] = c.F分类
    44  		existed.AddConfig(c.B编号, 数据)
    45  	}
    46  	return existed
    47  }
    48  
    49  func (set *ConfigTree) Load(files map[string]datax.M) {
    50  	for _, fileBody := range files {
    51  		for key, iconf := range fileBody {
    52  			conf := iconf.(datax.M)
    53  			obj := NewTreeItemByConf(key, conf)
    54  			delete(conf, "_type")
    55  			delete(conf, "_name")
    56  			delete(conf, "_catalog")
    57  			delete(conf, "_parent")
    58  			delete(conf, "_prefix")
    59  			delete(conf, "_suffix")
    60  			delete(conf, "_export")
    61  			delete(conf, "_default")
    62  			delete(conf, "_file")
    63  			obj.原始数据 = conf
    64  			set.datas.Push(obj)
    65  		}
    66  	}
    67  
    68  	修正集 := set.C查找_通过分类("修正")
    69  	for _, ival := range 修正集.datas.Slice() {
    70  		修正配置 := ival.(*ConfigTreeItem)
    71  		修正配置编号 := mapx.String(修正配置.原始数据, "配置编号")
    72  		if 修正配置编号 != "" {
    73  			配置 := set.C查找_通过编号(修正配置编号)
    74  			配置.T添加修正(修正配置.B编号)
    75  		}
    76  	}
    77  
    78  	root := set.S生成类树()
    79  	root.Walk(func(node *treex.TreeNode) bool {
    80  		if node.Data == nil {
    81  			return true
    82  		}
    83  		node配置 := node.Data.(*ConfigTreeItem)
    84  
    85  		if node配置 == nil {
    86  			return true
    87  		}
    88  		data := datax.M{}
    89  		node配置.数据 = data
    90  
    91  		decl := node配置.GetSchema()
    92  		if decl != nil {
    93  			_ = schemax.InitObj(data, decl)
    94  		}
    95  
    96  		if node.Parent != nil {
    97  			parent := node.Parent.(*treex.TreeNode)
    98  			if parent.Data != nil {
    99  				parent配置 := parent.Data.(*ConfigTreeItem)
   100  				mapx.Copy(parent配置.数据, data)
   101  				node配置.T添加修正集(parent配置.X修正)
   102  			}
   103  
   104  		}
   105  		if node配置.L类型 == "" {
   106  			if node.Parent != "" {
   107  				parent := node.Parent.(*treex.TreeNode)
   108  				if parent.Data != nil {
   109  					parent配置 := parent.Data.(*ConfigTreeItem)
   110  					node配置.L类型 = parent配置.L类型
   111  				}
   112  			}
   113  		}
   114  		mapx.Copy(node配置.原始数据, data)
   115  		return true
   116  	})
   117  }
   118  func (set *ConfigTree) C查找_通过文件(文件 string) (result *ConfigTree) {
   119  	result = NewConfigTree()
   120  	for _, ival := range set.datas.Slice() {
   121  		val := ival.(*ConfigTreeItem)
   122  		if val.W文件 == 文件 {
   123  			result.datas.Push(val)
   124  		}
   125  	}
   126  	return
   127  }
   128  
   129  func (set *ConfigTree) C查找_通过目录(目录 string) (result *ConfigTree) {
   130  	result = NewConfigTree()
   131  	for _, ival := range set.datas.Slice() {
   132  		val := ival.(*ConfigTreeItem)
   133  		if strings.Contains(val.W文件, 目录) {
   134  			result.datas.Push(val)
   135  		}
   136  	}
   137  	return
   138  }
   139  
   140  func (set *ConfigTree) C查找_通过分类(分类 string) (result *ConfigTree) {
   141  	result = NewConfigTree()
   142  	for _, ival := range set.datas.Slice() {
   143  		val := ival.(*ConfigTreeItem)
   144  		if val.F分类 == 分类 {
   145  			result.datas.Push(val)
   146  		}
   147  	}
   148  	return
   149  }
   150  func (set *ConfigTree) C查找_通过类型(类型 string) (result *ConfigTree) {
   151  	result = NewConfigTree()
   152  	for _, ival := range set.datas.Slice() {
   153  		val := ival.(*ConfigTreeItem)
   154  		if val.L类型 == 类型 {
   155  			result.datas.Push(val)
   156  		}
   157  	}
   158  	return
   159  }
   160  
   161  func (set *ConfigTree) C查找_通过编号(编号 string) *ConfigTreeItem {
   162  	for i := 0; i < set.datas.Length(); i++ {
   163  		iitem := set.datas.At(i)
   164  		item := iitem.(*ConfigTreeItem)
   165  		if item.B编号 == 编号 {
   166  			return item
   167  		}
   168  	}
   169  
   170  	return nil
   171  }
   172  
   173  func (set *ConfigTree) C查找_通过修正(编号 string) (result *ConfigTree) {
   174  	result = NewConfigTree()
   175  	for _, ival := range set.datas.Slice() {
   176  		val := ival.(*ConfigTreeItem)
   177  		if val.B包含修正(编号) {
   178  			result.datas.Push(val)
   179  		}
   180  	}
   181  
   182  	return
   183  }
   184  
   185  func (set *ConfigTree) S生成类树() *treex.TreeRoot {
   186  
   187  	var list []*treex.TreeListItem
   188  	list = append(list, &treex.TreeListItem{
   189  		Id: "/",
   190  	})
   191  
   192  	for i := 0; i < set.datas.Length(); i++ {
   193  		iitem := set.datas.At(i)
   194  		item := iitem.(*ConfigTreeItem)
   195  		if item.F父编号 != "" {
   196  			list = append(list, &treex.TreeListItem{
   197  				Id: item.B编号, Parent: item.F父编号, Data: item,
   198  			})
   199  		} else {
   200  			list = append(list, &treex.TreeListItem{
   201  				Id: item.B编号, Parent: "/", Data: item,
   202  			})
   203  		}
   204  	}
   205  	return treex.NewByList(list)
   206  }
   207  
   208  func (set *ConfigTree) ToSaveFileMap() datax.M {
   209  	result := datax.M{}
   210  	for _, val := range set.L列表().Slice() {
   211  		item := val.(*ConfigTreeItem)
   212  		result[item.B编号] = item.ToMap()
   213  	}
   214  	return result
   215  }