classinfo.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package importer
  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. datakey_fieldinfos 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. )
  61. newclassinfo("minfo", "minfo", "m3cnet",
  62. []*fieldinfo{
  63. {fieldname: "uniqueid", fieldtype: "varchar", keyidx: 1, datakey: "uniqueId"},
  64. {fieldname: "distname", fieldtype: "varchar", datakey: "distName"},
  65. {fieldname: "name", fieldtype: "varchar", datakey: "name"},
  66. {fieldname: "entitytypes", fieldtype: "set<varchar>", datakey: "entityTypes"},
  67. {fieldname: "extraattr", fieldtype: "varchar", datakey: ""},
  68. {fieldname: "tags", fieldtype: "set<varchar>", datakey: "tags"},
  69. },
  70. )
  71. newclassinfo("level1", "level1", "minfo", nil,
  72. [2]string{"partition", "name"},
  73. )
  74. newclassinfo("level2", "level2", "minfo", nil,
  75. [2]string{"partition", "name"},
  76. )
  77. newclassinfo("level3", "level3", "minfo", nil,
  78. [2]string{"partition", "name"},
  79. )
  80. newclassinfo("level4", "level4", "minfo", nil,
  81. [2]string{"partition", "name"},
  82. )
  83. newclassinfo("level5", "level5", "minfo", nil,
  84. [2]string{"partition", "name"},
  85. )
  86. newclassinfo("level6", "level6", "minfo", nil,
  87. [2]string{"partition", "name"},
  88. )
  89. newclassinfo("level7", "level7", "minfo", nil,
  90. [2]string{"partition", "name"},
  91. )
  92. newclassinfo("level8", "level8", "minfo", nil,
  93. [2]string{"partition", "name"},
  94. )
  95. }
  96. func newclassinfo(aliasname, classname, baseclassname string, fieldinfoslist []*fieldinfo, withoptions ...[2]string) (ci *classinfo) {
  97. defer func() {
  98. classnames = append(classnames, classname)
  99. classinfos.Set(classname, ci)
  100. }()
  101. fieldinfos := map[string]*fieldinfo{}
  102. datakey_fieldinfos := map[string]*fieldinfo{}
  103. fieldslist := []string{}
  104. keyfields := []string{}
  105. createmql := `create class if not exists ` + classname + `:` + baseclassname + `(`
  106. classfullname := ""
  107. bci := classinfos.GetIFPresent(baseclassname)
  108. if bci != nil {
  109. classfullname = bci.classfullname + "/" + classname
  110. for fn, fi := range bci.fieldinfos {
  111. fieldinfos[fn] = fi
  112. datakey_fieldinfos[fi.datakey] = fi
  113. }
  114. fieldslist = append(fieldslist, bci.fieldslist...)
  115. keyfields = append(keyfields, bci.keyfields...)
  116. } else {
  117. if baseclassname != "/" && baseclassname != "" {
  118. panic("baseclassname not defined " + baseclassname)
  119. }
  120. classfullname = "/" + classname
  121. }
  122. keyfield_defines := []string{}
  123. if len(fieldinfoslist) > 0 {
  124. field_defines := []string{}
  125. for _, fi := range fieldinfoslist {
  126. field_defines = append(field_defines, fi.fieldname+` `+fi.fieldtype+`"`+fi.datakey+`"`)
  127. fieldslist = append(fieldslist, fi.fieldname)
  128. if fi.keyidx > 0 {
  129. for len(keyfield_defines) < fi.keyidx {
  130. keyfield_defines = append(keyfield_defines, "")
  131. }
  132. keyfield_defines[fi.keyidx-1] = fi.fieldname
  133. }
  134. fieldinfos[fi.fieldname] = fi
  135. datakey_fieldinfos[fi.datakey] = fi
  136. }
  137. createmql += strings.Join(field_defines, ",")
  138. }
  139. if len(keyfield_defines) > 0 {
  140. createmql += ", keys(" + strings.Join(keyfield_defines, ",") + ")"
  141. keyfields = append(keyfields, keyfield_defines...)
  142. }
  143. createmql += `)with alias='` + aliasname + `'`
  144. for _, withoption := range withoptions {
  145. createmql += " and " + withoption[0] + "=" + withoption[1]
  146. }
  147. var insertmql string
  148. if len(fieldslist) > 0 {
  149. insertmql = `insert into ` + classname + "(" + strings.Join(fieldslist, ",") + ")values(" + strings.Repeat(",?", len(fieldslist))[1:] + ")"
  150. }
  151. ci = &classinfo{
  152. classname: classname,
  153. aliasname: aliasname,
  154. classfullname: classfullname,
  155. fieldinfos: fieldinfos,
  156. datakey_fieldinfos: datakey_fieldinfos,
  157. keyfields: keyfields,
  158. fieldslist: fieldslist,
  159. insertmql: insertmql,
  160. createmql: createmql,
  161. }
  162. return
  163. }
  164. var _ = `
  165. create class if not exists m3cnet : / ( )with ttl=366 day , autosearch=true , version=false , alias='m3cnet' , namespace='m3cnet' ;
  166. create class if not exists master : m3cnet (
  167. uniqueid varchar "UNIQUEID",
  168. name varchar "NAME",
  169. entitytypes varchar "ENTITYTYPES",
  170. basename varchar "BASENAME",
  171. entitytypesarr varchar "ENTITYTYPESARR",
  172. originid varchar "ID",
  173. tags set<varchar> "TAGS",
  174. changetime timestamp "CHANGETIME",
  175. emsname varchar "EMSNAME",
  176. sysid varchar "SYSID",
  177. site varchar "SITE",
  178. vendor varchar "VENDOR",
  179. ci_table varchar "CI_TABLE",
  180. ci_status varchar "CI_STATUS",
  181. rel_status varchar "REL_STATUS",
  182. stage varchar "STAGE",
  183. extraattr map<varchar,varchar> "EXTRAATTR",
  184. entityid varchar "ENTITYID",
  185. asmchangetime timestamp "ASMCHANGETIME",
  186. cmdbmapping varchar "CMDBMAPPING",
  187. ipaddress varchar "IPADDRESS",
  188. distname varchar "DISTNAME",
  189. site_source varchar "SITE_SOURCE",
  190. lastupdated timestamp "LASTUPDATED",
  191. keys( uniqueid )
  192. ) with partition=entitytypes , alias='master' ;
  193. create class if not exists minfo : m3cnet (
  194. uniqueid varchar,
  195. distName varchar,
  196. name varchar,
  197. entityTypes varchar,
  198. extraattr map<varchar,varchar>,
  199. tags set<varchar>,
  200. keys( uniqueid )
  201. ) with alias='minfo' ;
  202. create class if not exists level1 : minfo () with partition=entitytypes , alias='level1' ;
  203. create class if not exists level2 : minfo () with partition=entitytypes , alias='level2' ;
  204. create class if not exists level3 : minfo () with partition=entitytypes , alias='level3' ;
  205. create class if not exists level4 : minfo () with partition=entitytypes , alias='level4' ;
  206. create class if not exists level5 : minfo () with partition=entitytypes , alias='level5' ;
  207. create class if not exists level6 : minfo () with partition=entitytypes , alias='level6' ;
  208. create class if not exists level7 : minfo () with partition=entitytypes , alias='level7' ;
  209. create class if not exists level8 : minfo () with partition=entitytypes , alias='level8' ;
  210. `
  211. var createedgemqls = []string{
  212. `create edge type m3cnet.contain`,
  213. `create edge type m3cnet.depend`,
  214. `create edge type m3cnet.topology`,
  215. }