|
@@ -4,18 +4,18 @@ 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 // 对应数据中的键名
|
|
|
+ Keyidx int // 主键顺序值,0为非主键
|
|
|
+ Datakey []string // 对应数据中的键名
|
|
|
}
|
|
|
|
|
|
type ClassInfo struct {
|
|
|
- Classname string
|
|
|
- Aliasname string
|
|
|
+ Classaliasname string
|
|
|
Classfullname string
|
|
|
Fieldinfos map[string]*FieldInfo
|
|
|
DatakeyFieldinfos map[string]*FieldInfo
|
|
@@ -25,7 +25,7 @@ type ClassInfo struct {
|
|
|
Createmql string
|
|
|
}
|
|
|
|
|
|
-var ClassInfos = cmap.New[string, *ClassInfo]()
|
|
|
+var ClassInfos = cmap.NewSingle[string, *ClassInfo]()
|
|
|
var ClassNames = []string{}
|
|
|
|
|
|
func init() {
|
|
@@ -37,46 +37,53 @@ func init() {
|
|
|
)
|
|
|
newclassinfo("master", "master", "m3cnet",
|
|
|
[]*FieldInfo{
|
|
|
- {Fieldname: "uniqueid", Fieldtype: "varchar", Keyidx: 1, Datakey: "UNIQUEID"},
|
|
|
- {Fieldname: "name", Fieldtype: "varchar", Datakey: "NAME"},
|
|
|
- {Fieldname: "entitytypes", Fieldtype: "set<varchar>", Datakey: "ENTITYTYPES"},
|
|
|
- {Fieldname: "basename", Fieldtype: "varchar", Datakey: "BASENAME"},
|
|
|
- {Fieldname: "entitytypesarr", Fieldtype: "varchar", Datakey: "ENTITYTYPESARR"},
|
|
|
- {Fieldname: "originid", Fieldtype: "varchar", Datakey: "ID"},
|
|
|
- {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: "TAGS"},
|
|
|
- {Fieldname: "changetime", Fieldtype: "timestamp", Datakey: "CHANGETIME"},
|
|
|
- {Fieldname: "emsname", Fieldtype: "varchar", Datakey: "EMSNAME"},
|
|
|
- {Fieldname: "sysid", Fieldtype: "varchar", Datakey: "SYSID"},
|
|
|
- {Fieldname: "site", Fieldtype: "varchar", Datakey: "SITE"},
|
|
|
- {Fieldname: "vendor", Fieldtype: "varchar", Datakey: "VENDOR"},
|
|
|
- {Fieldname: "ci_table", Fieldtype: "varchar", Datakey: "CI_TABLE"},
|
|
|
- {Fieldname: "ci_status", Fieldtype: "varchar", Datakey: "CI_STATUS"},
|
|
|
- {Fieldname: "rel_status", Fieldtype: "varchar", Datakey: "REL_STATUS"},
|
|
|
- {Fieldname: "stage", Fieldtype: "varchar", Datakey: "STAGE"},
|
|
|
- {Fieldname: "extraattr", Fieldtype: "varchar", Datakey: "EXTRAATTR"},
|
|
|
- {Fieldname: "entityid", Fieldtype: "varchar", Datakey: "ENTITYID"},
|
|
|
- {Fieldname: "asmchangetime", Fieldtype: "int", Datakey: "ASMCHANGETIME"},
|
|
|
- {Fieldname: "cmdbmapping", Fieldtype: "varchar", Datakey: "CMDBMAPPING"},
|
|
|
- {Fieldname: "ipaddress", Fieldtype: "varchar", Datakey: "IPADDRESS"},
|
|
|
- {Fieldname: "distname", Fieldtype: "varchar", Datakey: "DISTNAME"},
|
|
|
- {Fieldname: "site_source", Fieldtype: "varchar", Datakey: "SITE_SOURCE"},
|
|
|
- {Fieldname: "lastupdated", Fieldtype: "timestamp", Datakey: "LASTUPDATED"},
|
|
|
+ {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: "int", 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{"partition", "name"},
|
|
|
[2]string{"key", "manu"},
|
|
|
)
|
|
|
newclassinfo("minfo", "minfo", "m3cnet",
|
|
|
[]*FieldInfo{
|
|
|
- {Fieldname: "uniqueid", Fieldtype: "varchar", Keyidx: 1, Datakey: "uniqueId"},
|
|
|
- {Fieldname: "distname", Fieldtype: "varchar", Datakey: "distName"},
|
|
|
- {Fieldname: "name", Fieldtype: "varchar", Datakey: "name"},
|
|
|
- {Fieldname: "entitytypes", Fieldtype: "set<varchar>", Datakey: "entityTypes"},
|
|
|
- {Fieldname: "extraattr", Fieldtype: "varchar", Datakey: ""},
|
|
|
- {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: "tags"},
|
|
|
+ {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: "extraattr", Fieldtype: "varchar", Datakey: []string{"*"}},
|
|
|
+ {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: []string{"tags"}},
|
|
|
},
|
|
|
[2]string{"key", "manu"},
|
|
|
)
|
|
|
- newclassinfo("level1", "level1", "minfo", nil,
|
|
|
+ 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: "extraattr", Fieldtype: "varchar", Datakey: []string{"*"}},
|
|
|
+ {Fieldname: "tags", Fieldtype: "set<varchar>", Datakey: []string{"tags"}},
|
|
|
+ },
|
|
|
[2]string{"partition", "name"},
|
|
|
[2]string{"key", "manu"},
|
|
|
)
|
|
@@ -110,38 +117,50 @@ func init() {
|
|
|
)
|
|
|
}
|
|
|
|
|
|
-func newclassinfo(aliasname, classname, baseclassname string, fieldinfoslist []*FieldInfo, withoptions ...[2]string) (ci *ClassInfo) {
|
|
|
- defer func() {
|
|
|
- ClassNames = append(ClassNames, classname)
|
|
|
- ClassInfos.Set(classname, ci)
|
|
|
- }()
|
|
|
+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 ` + classname + `:` + baseclassname + `(`
|
|
|
+ createmql := `create class if not exists ` + classsimplename + `:` + baseclassaliasname + `(`
|
|
|
classfullname := ""
|
|
|
- bci := ClassInfos.GetIFPresent(baseclassname)
|
|
|
+ bci := ClassInfos.GetIFPresent(baseclassaliasname)
|
|
|
if bci != nil {
|
|
|
- classfullname = bci.Classfullname + "/" + classname
|
|
|
+ classfullname = bci.Classfullname + "/" + classsimplename
|
|
|
for fn, fi := range bci.Fieldinfos {
|
|
|
fieldinfos[fn] = fi
|
|
|
- datakey_fieldinfos[fi.Datakey] = 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 baseclassname != "/" && baseclassname != "" {
|
|
|
- panic("baseclassname not defined " + baseclassname)
|
|
|
+ if baseclassaliasname != "/" && baseclassaliasname != "" {
|
|
|
+ panic("baseclassname not defined " + baseclassaliasname)
|
|
|
}
|
|
|
- classfullname = "/" + classname
|
|
|
+ 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_defines = append(field_defines, fi.Fieldname+` `+fi.Fieldtype+`"`+fi.Datakey+`"`)
|
|
|
- fieldslist = append(fieldslist, fi.Fieldname)
|
|
|
+ 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, "")
|
|
@@ -149,7 +168,9 @@ func newclassinfo(aliasname, classname, baseclassname string, fieldinfoslist []*
|
|
|
keyfield_defines[fi.Keyidx-1] = fi.Fieldname
|
|
|
}
|
|
|
fieldinfos[fi.Fieldname] = fi
|
|
|
- datakey_fieldinfos[fi.Datakey] = fi
|
|
|
+ for _, dk := range fi.Datakey {
|
|
|
+ datakey_fieldinfos[dk] = fi
|
|
|
+ }
|
|
|
}
|
|
|
createmql += strings.Join(field_defines, ",")
|
|
|
}
|
|
@@ -157,24 +178,35 @@ func newclassinfo(aliasname, classname, baseclassname string, fieldinfoslist []*
|
|
|
createmql += ", keys(" + strings.Join(keyfield_defines, ",") + ")"
|
|
|
keyfields = append(keyfields, keyfield_defines...)
|
|
|
}
|
|
|
- createmql += `)with alias='` + aliasname + `'`
|
|
|
+ createmql += `)with alias='` + classaliasname + `'`
|
|
|
for _, withoption := range withoptions {
|
|
|
createmql += " and " + withoption[0] + "=" + withoption[1]
|
|
|
if withoption[0] == "key" && withoption[1] == "manu" {
|
|
|
- fieldslist = append([]string{"id"}, fieldslist...)
|
|
|
+ if !fieldsset.Has("id") {
|
|
|
+ fieldslist = append([]string{"id"}, fieldslist...)
|
|
|
+ fieldsset.Add("id")
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- fieldslist = append(fieldslist, "contain")
|
|
|
- fieldslist = append(fieldslist, "depend")
|
|
|
- fieldslist = append(fieldslist, "topology")
|
|
|
+ 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 ` + classname + "(" + strings.Join(fieldslist, ",") + ")values(" + strings.Repeat(",?", len(fieldslist))[1:] + ")"
|
|
|
+ insertmql = `insert into ` + classfullname + "(" + strings.Join(fieldslist, ",") + ")values(" + strings.Repeat(",?", len(fieldslist))[1:] + ")"
|
|
|
}
|
|
|
ci = &ClassInfo{
|
|
|
- Classname: classname,
|
|
|
- Aliasname: aliasname,
|
|
|
+ Classaliasname: classaliasname,
|
|
|
Classfullname: classfullname,
|
|
|
Fieldinfos: fieldinfos,
|
|
|
DatakeyFieldinfos: datakey_fieldinfos,
|
|
@@ -229,7 +261,7 @@ create class if not exists minfo : m3cnet (
|
|
|
keys( uniqueid )
|
|
|
) with alias='minfo' ;
|
|
|
|
|
|
-create class if not exists level1 : minfo () with partition=entitytypes , alias='level1' ;
|
|
|
+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' ;
|