classinfo.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. package schema
  2. import (
  3. "strings"
  4. "git.wecise.com/wecise/util/cmap"
  5. "github.com/scylladb/go-set/strset"
  6. )
  7. type FieldInfo struct {
  8. Fieldname string
  9. Fieldtype string
  10. Keyidx int // 主键顺序值,0为非主键
  11. Datakey []string // 对应数据中的键名
  12. }
  13. type ClassInfo struct {
  14. Classaliasname string
  15. Classfullname string
  16. Fieldinfos map[string]*FieldInfo
  17. DatakeyFieldinfos map[string]*FieldInfo
  18. Keyfields []string
  19. Fieldslist []string
  20. Insertmql string
  21. Createmql string
  22. Addtagmql string
  23. }
  24. var ClassInfos = cmap.NewSingle[string, *ClassInfo]()
  25. var ClassNames = []string{}
  26. func init() {
  27. newclassinfo("m3cnet", "m3cnet", "/", nil,
  28. [2]string{"ttl", "366 day"},
  29. [2]string{"autosearch", "true"},
  30. [2]string{"version", "false"},
  31. [2]string{"namespace", "'m3cnet'"},
  32. )
  33. newclassinfo("master", "master", "m3cnet",
  34. []*FieldInfo{
  35. {Fieldname: "uniqueid", Fieldtype: "varchar", Keyidx: 1, Datakey: []string{"UNIQUEID"}},
  36. {Fieldname: "name", Fieldtype: "varchar", Datakey: []string{"NAME"}},
  37. {Fieldname: "entitytypes", Fieldtype: "set<varchar>", Datakey: []string{"ENTITYTYPES"}},
  38. {Fieldname: "basename", Fieldtype: "varchar", Datakey: []string{"BASENAME"}},
  39. {Fieldname: "entitytypesarr", Fieldtype: "varchar", Datakey: []string{"ENTITYTYPESARR"}},
  40. {Fieldname: "originid", Fieldtype: "varchar", Datakey: []string{"ID"}},
  41. {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: []string{"TAGS"}},
  42. {Fieldname: "changetime", Fieldtype: "timestamp", Datakey: []string{"CHANGETIME"}},
  43. {Fieldname: "emsname", Fieldtype: "varchar", Datakey: []string{"EMSNAME"}},
  44. {Fieldname: "sysid", Fieldtype: "varchar", Datakey: []string{"SYSID"}},
  45. {Fieldname: "site", Fieldtype: "varchar", Datakey: []string{"SITE"}},
  46. {Fieldname: "vendor", Fieldtype: "varchar", Datakey: []string{"VENDOR"}},
  47. {Fieldname: "ci_table", Fieldtype: "varchar", Datakey: []string{"CI_TABLE"}},
  48. {Fieldname: "ci_status", Fieldtype: "varchar", Datakey: []string{"CI_STATUS"}},
  49. {Fieldname: "rel_status", Fieldtype: "varchar", Datakey: []string{"REL_STATUS"}},
  50. {Fieldname: "stage", Fieldtype: "varchar", Datakey: []string{"STAGE"}},
  51. {Fieldname: "extraattr", Fieldtype: "varchar", Datakey: []string{"EXTRAATTR"}},
  52. {Fieldname: "entityid", Fieldtype: "varchar", Datakey: []string{"ENTITYID"}},
  53. {Fieldname: "asmchangetime", Fieldtype: "bigint", Datakey: []string{"ASMCHANGETIME"}},
  54. {Fieldname: "cmdbmapping", Fieldtype: "varchar", Datakey: []string{"CMDBMAPPING"}},
  55. {Fieldname: "ipaddress", Fieldtype: "varchar", Datakey: []string{"IPADDRESS"}},
  56. {Fieldname: "distname", Fieldtype: "varchar", Datakey: []string{"DISTNAME"}},
  57. {Fieldname: "site_source", Fieldtype: "varchar", Datakey: []string{"SITE_SOURCE"}},
  58. {Fieldname: "lastupdated", Fieldtype: "timestamp", Datakey: []string{"LASTUPDATED"}},
  59. },
  60. [2]string{"key", "manu"},
  61. )
  62. newclassinfo("minfo", "minfo", "m3cnet",
  63. []*FieldInfo{
  64. {Fieldname: "uniqueid", Fieldtype: "varchar", Keyidx: 1, Datakey: []string{"uniqueId"}},
  65. {Fieldname: "distname", Fieldtype: "varchar", Datakey: []string{"distName"}},
  66. {Fieldname: "name", Fieldtype: "varchar", Datakey: []string{"name"}},
  67. {Fieldname: "entitytypes", Fieldtype: "set<varchar>", Datakey: []string{"entityTypes"}},
  68. {Fieldname: "extends", Fieldtype: "map<varchar,varchar>", Datakey: []string{"*"}},
  69. {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: []string{"tags"}},
  70. },
  71. [2]string{"key", "manu"},
  72. )
  73. newclassinfo("level1", "level1", "master",
  74. []*FieldInfo{
  75. {Fieldname: "uniqueid", Fieldtype: "varchar", Keyidx: 1, Datakey: []string{"uniqueId"}},
  76. {Fieldname: "distname", Fieldtype: "varchar", Datakey: []string{"distName"}},
  77. {Fieldname: "name", Fieldtype: "varchar", Datakey: []string{"name"}},
  78. {Fieldname: "entitytypes", Fieldtype: "set<varchar>", Datakey: []string{"entityTypes"}},
  79. {Fieldname: "extends", Fieldtype: "map<varchar,varchar>", Datakey: []string{"*"}},
  80. {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: []string{"tags"}},
  81. },
  82. [2]string{"partition", "name"},
  83. [2]string{"key", "manu"},
  84. )
  85. newclassinfo("level2", "level2", "minfo", nil,
  86. [2]string{"partition", "name"},
  87. [2]string{"key", "manu"},
  88. )
  89. newclassinfo("level3", "level3", "minfo", nil,
  90. [2]string{"partition", "name"},
  91. [2]string{"key", "manu"},
  92. )
  93. newclassinfo("level4", "level4", "minfo", nil,
  94. [2]string{"partition", "name"},
  95. [2]string{"key", "manu"},
  96. )
  97. newclassinfo("level5", "level5", "minfo", nil,
  98. [2]string{"partition", "name"},
  99. [2]string{"key", "manu"},
  100. )
  101. newclassinfo("level6", "level6", "minfo", nil,
  102. [2]string{"partition", "name"},
  103. [2]string{"key", "manu"},
  104. )
  105. newclassinfo("level7", "level7", "minfo", nil,
  106. [2]string{"partition", "name"},
  107. [2]string{"key", "manu"},
  108. )
  109. newclassinfo("level8", "level8", "minfo", nil,
  110. [2]string{"partition", "name"},
  111. [2]string{"key", "manu"},
  112. )
  113. }
  114. func newclassinfo(classaliasname, classsimplename, baseclassaliasname string, fieldinfoslist []*FieldInfo, withoptions ...[2]string) (ci *ClassInfo) {
  115. fieldinfos := map[string]*FieldInfo{}
  116. datakey_fieldinfos := map[string]*FieldInfo{}
  117. fieldslist := []string{}
  118. fieldsset := strset.New()
  119. keyfields := []string{}
  120. createmql := `create class if not exists ` + classsimplename + `:` + baseclassaliasname + `(`
  121. classfullname := ""
  122. bci := ClassInfos.GetIFPresent(baseclassaliasname)
  123. if bci != nil {
  124. classfullname = bci.Classfullname + "/" + classsimplename
  125. for fn, fi := range bci.Fieldinfos {
  126. fieldinfos[fn] = fi
  127. for _, dk := range fi.Datakey {
  128. datakey_fieldinfos[dk] = fi
  129. }
  130. }
  131. fieldslist = append(fieldslist, bci.Fieldslist...)
  132. fieldsset.Add(bci.Fieldslist...)
  133. keyfields = append(keyfields, bci.Keyfields...)
  134. } else {
  135. if baseclassaliasname != "/" && baseclassaliasname != "" {
  136. panic("baseclassname not defined " + baseclassaliasname)
  137. }
  138. classfullname = "/" + classsimplename
  139. }
  140. defer func() {
  141. ClassNames = append(ClassNames, classaliasname)
  142. ClassInfos.Set(classaliasname, ci)
  143. ClassInfos.Set(classfullname, ci)
  144. }()
  145. keyfield_defines := []string{}
  146. if len(fieldinfoslist) > 0 {
  147. field_defines := []string{}
  148. for _, fi := range fieldinfoslist {
  149. field_define := fi.Fieldname + ` ` + fi.Fieldtype
  150. if !fieldsset.Has(fi.Fieldname) {
  151. fieldslist = append(fieldslist, fi.Fieldname)
  152. fieldsset.Add(fi.Fieldname)
  153. } else {
  154. fi.Datakey = append(fi.Datakey, bci.Fieldinfos[fi.Fieldname].Datakey...)
  155. }
  156. field_define += `"` + strings.Join(fi.Datakey, ",") + `"`
  157. field_defines = append(field_defines, field_define)
  158. if fi.Keyidx > 0 {
  159. for len(keyfield_defines) < fi.Keyidx {
  160. keyfield_defines = append(keyfield_defines, "")
  161. }
  162. keyfield_defines[fi.Keyidx-1] = fi.Fieldname
  163. }
  164. fieldinfos[fi.Fieldname] = fi
  165. for _, dk := range fi.Datakey {
  166. datakey_fieldinfos[dk] = fi
  167. }
  168. }
  169. createmql += strings.Join(field_defines, ",")
  170. }
  171. if len(keyfield_defines) > 0 {
  172. createmql += ", keys(" + strings.Join(keyfield_defines, ",") + ")"
  173. keyfields = append(keyfields, keyfield_defines...)
  174. }
  175. createmql += `)with alias='` + classaliasname + `'`
  176. for _, withoption := range withoptions {
  177. createmql += " and " + withoption[0] + "=" + withoption[1]
  178. if withoption[0] == "key" && withoption[1] == "manu" {
  179. if !fieldsset.Has("id") {
  180. fieldslist = append([]string{"id"}, fieldslist...)
  181. fieldsset.Add("id")
  182. }
  183. }
  184. }
  185. if !fieldsset.Has("contain") {
  186. fieldslist = append(fieldslist, "contain")
  187. fieldsset.Add("contain")
  188. }
  189. if !fieldsset.Has("depend") {
  190. fieldslist = append(fieldslist, "depend")
  191. fieldsset.Add("depend")
  192. }
  193. if !fieldsset.Has("topology") {
  194. fieldslist = append(fieldslist, "topology")
  195. fieldsset.Add("topology")
  196. }
  197. var insertmql string
  198. if len(fieldslist) > 0 {
  199. insertmql = `insert into ` + classfullname + "(" + strings.Join(fieldslist, ",") + ")values(" + strings.Repeat(",?", len(fieldslist))[1:] + ")"
  200. }
  201. addtagmql := `insert into /matrix/tagdir (name,path,tags,domain,creater) values(?,?,?,'graph','system')`
  202. ci = &ClassInfo{
  203. Classaliasname: classaliasname,
  204. Classfullname: classfullname,
  205. Fieldinfos: fieldinfos,
  206. DatakeyFieldinfos: datakey_fieldinfos,
  207. Keyfields: keyfields,
  208. Fieldslist: fieldslist,
  209. Insertmql: insertmql,
  210. Createmql: createmql,
  211. Addtagmql: addtagmql,
  212. }
  213. return
  214. }
  215. var _ = `
  216. create class if not exists m3cnet : / ( )with ttl=366 day , autosearch=true , version=false , alias='m3cnet' , namespace='m3cnet' ;
  217. create class if not exists master : m3cnet (
  218. uniqueid varchar "UNIQUEID",
  219. name varchar "NAME",
  220. entitytypes varchar "ENTITYTYPES",
  221. basename varchar "BASENAME",
  222. entitytypesarr varchar "ENTITYTYPESARR",
  223. originid varchar "ID",
  224. tags set<varchar> "TAGS",
  225. changetime timestamp "CHANGETIME",
  226. emsname varchar "EMSNAME",
  227. sysid varchar "SYSID",
  228. site varchar "SITE",
  229. vendor varchar "VENDOR",
  230. ci_table varchar "CI_TABLE",
  231. ci_status varchar "CI_STATUS",
  232. rel_status varchar "REL_STATUS",
  233. stage varchar "STAGE",
  234. extraattr map<varchar,varchar> "EXTRAATTR",
  235. entityid varchar "ENTITYID",
  236. asmchangetime timestamp "ASMCHANGETIME",
  237. cmdbmapping varchar "CMDBMAPPING",
  238. ipaddress varchar "IPADDRESS",
  239. distname varchar "DISTNAME",
  240. site_source varchar "SITE_SOURCE",
  241. lastupdated timestamp "LASTUPDATED",
  242. keys( uniqueid )
  243. ) with partition=entitytypes , alias='master' ;
  244. create class if not exists minfo : m3cnet (
  245. uniqueid varchar,
  246. distName varchar,
  247. name varchar,
  248. entityTypes varchar,
  249. extraattr map<varchar,varchar>,
  250. tags set<varchar>,
  251. keys( uniqueid )
  252. ) with alias='minfo' ;
  253. create class if not exists level1 : master () with partition=entitytypes , alias='level1' ;
  254. create class if not exists level2 : minfo () with partition=entitytypes , alias='level2' ;
  255. create class if not exists level3 : minfo () with partition=entitytypes , alias='level3' ;
  256. create class if not exists level4 : minfo () with partition=entitytypes , alias='level4' ;
  257. create class if not exists level5 : minfo () with partition=entitytypes , alias='level5' ;
  258. create class if not exists level6 : minfo () with partition=entitytypes , alias='level6' ;
  259. create class if not exists level7 : minfo () with partition=entitytypes , alias='level7' ;
  260. create class if not exists level8 : minfo () with partition=entitytypes , alias='level8' ;
  261. `
  262. var Relations = map[string]string{
  263. "contains": "contain",
  264. "contain": "contain",
  265. "dependon": "depend",
  266. "depend": "depend",
  267. "topology": "topology",
  268. }
  269. var CreateEdgeMqls = []string{
  270. `create edge type m3cnet.contain`,
  271. `create edge type m3cnet.depend`,
  272. `create edge type m3cnet.topology`,
  273. }