classinfo.go 8.9 KB

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