123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- package schema
- import (
- "strings"
- "github.com/scylladb/go-set/strset"
- "github.com/wecisecode/util/cmap"
- )
- type FieldInfo struct {
- Fieldname string
- Fieldtype string
- Keyidx int // 主键顺序值,0为非主键
- Datakey []string // 对应数据中的键名
- }
- type ClassInfo struct {
- Classaliasname string
- Classfullname string
- Fieldinfos map[string]*FieldInfo
- DatakeyFieldinfos map[string]*FieldInfo
- Keyfields []string
- Fieldslist []string
- Insertmql string
- Createmql string
- Addtagmql string
- }
- var ClassInfos = cmap.NewSingle[string, *ClassInfo]()
- var ClassNames = []string{}
- func init() {
- newclassinfo("m3cnet", "m3cnet", "/", nil,
- [2]string{"ttl", "366 day"},
- [2]string{"autosearch", "true"},
- [2]string{"version", "false"},
- [2]string{"namespace", "'m3cnet'"},
- )
- newclassinfo("master", "master", "m3cnet",
- []*FieldInfo{
- {Fieldname: "uniqueid", Fieldtype: "varchar", Keyidx: 1, Datakey: []string{"UNIQUEID"}},
- {Fieldname: "name", Fieldtype: "varchar", Datakey: []string{"NAME"}},
- {Fieldname: "entitytypes", Fieldtype: "set<varchar>", Datakey: []string{"ENTITYTYPES"}},
- {Fieldname: "basename", Fieldtype: "varchar", Datakey: []string{"BASENAME"}},
- {Fieldname: "entitytypesarr", Fieldtype: "varchar", Datakey: []string{"ENTITYTYPESARR"}},
- {Fieldname: "originid", Fieldtype: "varchar", Datakey: []string{"ID"}},
- {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: []string{"TAGS"}},
- {Fieldname: "changetime", Fieldtype: "timestamp", Datakey: []string{"CHANGETIME"}},
- {Fieldname: "emsname", Fieldtype: "varchar", Datakey: []string{"EMSNAME"}},
- {Fieldname: "sysid", Fieldtype: "varchar", Datakey: []string{"SYSID"}},
- {Fieldname: "site", Fieldtype: "varchar", Datakey: []string{"SITE"}},
- {Fieldname: "vendor", Fieldtype: "varchar", Datakey: []string{"VENDOR"}},
- {Fieldname: "ci_table", Fieldtype: "varchar", Datakey: []string{"CI_TABLE"}},
- {Fieldname: "ci_status", Fieldtype: "varchar", Datakey: []string{"CI_STATUS"}},
- {Fieldname: "rel_status", Fieldtype: "varchar", Datakey: []string{"REL_STATUS"}},
- {Fieldname: "stage", Fieldtype: "varchar", Datakey: []string{"STAGE"}},
- {Fieldname: "extraattr", Fieldtype: "varchar", Datakey: []string{"EXTRAATTR"}},
- {Fieldname: "entityid", Fieldtype: "varchar", Datakey: []string{"ENTITYID"}},
- {Fieldname: "asmchangetime", Fieldtype: "bigint", Datakey: []string{"ASMCHANGETIME"}},
- {Fieldname: "cmdbmapping", Fieldtype: "varchar", Datakey: []string{"CMDBMAPPING"}},
- {Fieldname: "ipaddress", Fieldtype: "varchar", Datakey: []string{"IPADDRESS"}},
- {Fieldname: "distname", Fieldtype: "varchar", Datakey: []string{"DISTNAME"}},
- {Fieldname: "site_source", Fieldtype: "varchar", Datakey: []string{"SITE_SOURCE"}},
- {Fieldname: "lastupdated", Fieldtype: "timestamp", Datakey: []string{"LASTUPDATED"}},
- },
- [2]string{"key", "manu"},
- )
- newclassinfo("minfo", "minfo", "m3cnet",
- []*FieldInfo{
- {Fieldname: "uniqueid", Fieldtype: "varchar", Keyidx: 1, Datakey: []string{"uniqueId"}},
- {Fieldname: "distname", Fieldtype: "varchar", Datakey: []string{"distName"}},
- {Fieldname: "name", Fieldtype: "varchar", Datakey: []string{"name"}},
- {Fieldname: "entitytypes", Fieldtype: "set<varchar>", Datakey: []string{"entityTypes"}},
- {Fieldname: "extends", Fieldtype: "map<varchar,varchar>", Datakey: []string{"*"}},
- {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: []string{"tags"}},
- },
- [2]string{"key", "manu"},
- )
- newclassinfo("level1", "level1", "master",
- []*FieldInfo{
- {Fieldname: "uniqueid", Fieldtype: "varchar", Keyidx: 1, Datakey: []string{"uniqueId"}},
- {Fieldname: "distname", Fieldtype: "varchar", Datakey: []string{"distName"}},
- {Fieldname: "name", Fieldtype: "varchar", Datakey: []string{"name"}},
- {Fieldname: "entitytypes", Fieldtype: "set<varchar>", Datakey: []string{"entityTypes"}},
- {Fieldname: "extends", Fieldtype: "map<varchar,varchar>", Datakey: []string{"*"}},
- {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: []string{"tags"}},
- },
- [2]string{"partition", "name"},
- [2]string{"key", "manu"},
- )
- newclassinfo("level2", "level2", "minfo", nil,
- [2]string{"partition", "name"},
- [2]string{"key", "manu"},
- )
- newclassinfo("level3", "level3", "minfo", nil,
- [2]string{"partition", "name"},
- [2]string{"key", "manu"},
- )
- newclassinfo("level4", "level4", "minfo", nil,
- [2]string{"partition", "name"},
- [2]string{"key", "manu"},
- )
- newclassinfo("level5", "level5", "minfo", nil,
- [2]string{"partition", "name"},
- [2]string{"key", "manu"},
- )
- newclassinfo("level6", "level6", "minfo", nil,
- [2]string{"partition", "name"},
- [2]string{"key", "manu"},
- )
- newclassinfo("level7", "level7", "minfo", nil,
- [2]string{"partition", "name"},
- [2]string{"key", "manu"},
- )
- newclassinfo("level8", "level8", "minfo", nil,
- [2]string{"partition", "name"},
- [2]string{"key", "manu"},
- )
- }
- func newclassinfo(classaliasname, classsimplename, baseclassaliasname string, fieldinfoslist []*FieldInfo, withoptions ...[2]string) (ci *ClassInfo) {
- fieldinfos := map[string]*FieldInfo{}
- datakey_fieldinfos := map[string]*FieldInfo{}
- fieldslist := []string{}
- fieldsset := strset.New()
- keyfields := []string{}
- createmql := `create class if not exists ` + classsimplename + `:` + baseclassaliasname + `(`
- classfullname := ""
- bci := ClassInfos.GetIFPresent(baseclassaliasname)
- if bci != nil {
- classfullname = bci.Classfullname + "/" + classsimplename
- for fn, fi := range bci.Fieldinfos {
- fieldinfos[fn] = fi
- for _, dk := range fi.Datakey {
- datakey_fieldinfos[dk] = fi
- }
- }
- fieldslist = append(fieldslist, bci.Fieldslist...)
- fieldsset.Add(bci.Fieldslist...)
- keyfields = append(keyfields, bci.Keyfields...)
- } else {
- if baseclassaliasname != "/" && baseclassaliasname != "" {
- panic("baseclassname not defined " + baseclassaliasname)
- }
- classfullname = "/" + classsimplename
- }
- defer func() {
- ClassNames = append(ClassNames, classaliasname)
- ClassInfos.Set(classaliasname, ci)
- ClassInfos.Set(classfullname, ci)
- }()
- keyfield_defines := []string{}
- if len(fieldinfoslist) > 0 {
- field_defines := []string{}
- for _, fi := range fieldinfoslist {
- field_define := fi.Fieldname + ` ` + fi.Fieldtype
- if !fieldsset.Has(fi.Fieldname) {
- fieldslist = append(fieldslist, fi.Fieldname)
- fieldsset.Add(fi.Fieldname)
- } else {
- fi.Datakey = append(fi.Datakey, bci.Fieldinfos[fi.Fieldname].Datakey...)
- }
- field_define += `"` + strings.Join(fi.Datakey, ",") + `"`
- field_defines = append(field_defines, field_define)
- if fi.Keyidx > 0 {
- for len(keyfield_defines) < fi.Keyidx {
- keyfield_defines = append(keyfield_defines, "")
- }
- keyfield_defines[fi.Keyidx-1] = fi.Fieldname
- }
- fieldinfos[fi.Fieldname] = fi
- for _, dk := range fi.Datakey {
- datakey_fieldinfos[dk] = fi
- }
- }
- createmql += strings.Join(field_defines, ",")
- }
- if len(keyfield_defines) > 0 {
- createmql += ", keys(" + strings.Join(keyfield_defines, ",") + ")"
- keyfields = append(keyfields, keyfield_defines...)
- }
- createmql += `)with alias='` + classaliasname + `'`
- for _, withoption := range withoptions {
- createmql += " and " + withoption[0] + "=" + withoption[1]
- if withoption[0] == "key" && withoption[1] == "manu" {
- if !fieldsset.Has("id") {
- fieldslist = append([]string{"id"}, fieldslist...)
- fieldsset.Add("id")
- }
- }
- }
- if !fieldsset.Has("contain") {
- fieldslist = append(fieldslist, "contain")
- fieldsset.Add("contain")
- }
- if !fieldsset.Has("depend") {
- fieldslist = append(fieldslist, "depend")
- fieldsset.Add("depend")
- }
- if !fieldsset.Has("topology") {
- fieldslist = append(fieldslist, "topology")
- fieldsset.Add("topology")
- }
- var insertmql string
- if len(fieldslist) > 0 {
- insertmql = `insert into ` + classfullname + "(" + strings.Join(fieldslist, ",") + ")values(" + strings.Repeat(",?", len(fieldslist))[1:] + ")"
- }
- addtagmql := `insert into /matrix/tagdir (name,path,tags,domain,creater) values(?,?,?,'graph','system')`
- ci = &ClassInfo{
- Classaliasname: classaliasname,
- Classfullname: classfullname,
- Fieldinfos: fieldinfos,
- DatakeyFieldinfos: datakey_fieldinfos,
- Keyfields: keyfields,
- Fieldslist: fieldslist,
- Insertmql: insertmql,
- Createmql: createmql,
- Addtagmql: addtagmql,
- }
- return
- }
- var _ = `
- create class if not exists m3cnet : / ( )with ttl=366 day , autosearch=true , version=false , alias='m3cnet' , namespace='m3cnet' ;
- create class if not exists master : m3cnet (
- uniqueid varchar "UNIQUEID",
- name varchar "NAME",
- entitytypes varchar "ENTITYTYPES",
- basename varchar "BASENAME",
- entitytypesarr varchar "ENTITYTYPESARR",
- originid varchar "ID",
- tags set<varchar> "TAGS",
- changetime timestamp "CHANGETIME",
- emsname varchar "EMSNAME",
- sysid varchar "SYSID",
- site varchar "SITE",
- vendor varchar "VENDOR",
- ci_table varchar "CI_TABLE",
- ci_status varchar "CI_STATUS",
- rel_status varchar "REL_STATUS",
- stage varchar "STAGE",
- extraattr map<varchar,varchar> "EXTRAATTR",
- entityid varchar "ENTITYID",
- asmchangetime timestamp "ASMCHANGETIME",
- cmdbmapping varchar "CMDBMAPPING",
- ipaddress varchar "IPADDRESS",
- distname varchar "DISTNAME",
- site_source varchar "SITE_SOURCE",
- lastupdated timestamp "LASTUPDATED",
- keys( uniqueid )
- ) with partition=entitytypes , alias='master' ;
- create class if not exists minfo : m3cnet (
- uniqueid varchar,
- distName varchar,
- name varchar,
- entityTypes varchar,
- extraattr map<varchar,varchar>,
- tags set<varchar>,
-
- keys( uniqueid )
- ) with alias='minfo' ;
- create class if not exists level1 : master () with partition=entitytypes , alias='level1' ;
- create class if not exists level2 : minfo () with partition=entitytypes , alias='level2' ;
- create class if not exists level3 : minfo () with partition=entitytypes , alias='level3' ;
- create class if not exists level4 : minfo () with partition=entitytypes , alias='level4' ;
- create class if not exists level5 : minfo () with partition=entitytypes , alias='level5' ;
- create class if not exists level6 : minfo () with partition=entitytypes , alias='level6' ;
- create class if not exists level7 : minfo () with partition=entitytypes , alias='level7' ;
- create class if not exists level8 : minfo () with partition=entitytypes , alias='level8' ;
- `
- var Relations = map[string]string{
- "contains": "contain",
- "contain": "contain",
- "dependon": "depend",
- "depend": "depend",
- "topology": "topology",
- }
- var CreateEdgeMqls = []string{
- `create edge type m3cnet.contain`,
- `create edge type m3cnet.depend`,
- `create edge type m3cnet.topology`,
- }
|