classinfo.go 10 KB

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