package schema import ( "strings" "git.wecise.com/wecise/util/cmap" "github.com/scylladb/go-set/strset" ) 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", 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", 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", Datakey: []string{"entityTypes"}}, {Fieldname: "extends", Fieldtype: "map", Datakey: []string{"*"}}, {Fieldname: "tags", Fieldtype: "set", 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", Datakey: []string{"entityTypes"}}, {Fieldname: "extends", Fieldtype: "map", Datakey: []string{"*"}}, {Fieldname: "tags", Fieldtype: "set", 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 "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 "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, tags set, 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`, }