libf 2 mesi fa
parent
commit
acdf7b57b0
5 ha cambiato i file con 25 aggiunte e 195 eliminazioni
  1. 1 1
      go.mod
  2. 2 2
      go.sum
  3. 20 25
      importer/classstruct.go
  4. 2 2
      reader/csvreader.go
  5. 0 165
      schema/classinfo.go

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module git.wecise.com/wecise/cgimport
 go 1.22.0
 
 require (
-	git.wecise.com/wecise/odb-go v0.0.0-20250224095700-05adc4d30431
+	git.wecise.com/wecise/odb-go v0.0.0-20250224131503-50eb807bbe42
 	github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da
 	github.com/scylladb/go-set v1.0.2
 	github.com/spf13/cast v1.7.1

+ 2 - 2
go.sum

@@ -1,5 +1,5 @@
-git.wecise.com/wecise/odb-go v0.0.0-20250224095700-05adc4d30431 h1:VTCFyFviYSMmDLlYNDvLdxAQfpupVzgz6rjO1cHHoto=
-git.wecise.com/wecise/odb-go v0.0.0-20250224095700-05adc4d30431/go.mod h1:xIY+Dmw2LK9ephqNs8r8clD6zQ5+BuaTgk+6TxEe15M=
+git.wecise.com/wecise/odb-go v0.0.0-20250224131503-50eb807bbe42 h1:19RGgqaA4liw4zQuBR8oTyfPKJrdOD+TRwQBzufOgno=
+git.wecise.com/wecise/odb-go v0.0.0-20250224131503-50eb807bbe42/go.mod h1:xIY+Dmw2LK9ephqNs8r8clD6zQ5+BuaTgk+6TxEe15M=
 github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
 github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
 github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=

+ 20 - 25
importer/classstruct.go

@@ -9,6 +9,7 @@ import (
 	"time"
 
 	"git.wecise.com/wecise/cgimport/schema"
+	ci "git.wecise.com/wecise/odb-go/schema"
 	"github.com/wecisecode/util/cmap"
 	"github.com/wecisecode/util/merrs"
 	"github.com/wecisecode/util/mio"
@@ -16,7 +17,7 @@ import (
 )
 
 type classdatainfo struct {
-	*schema.ClassInfo
+	*ci.ClassInfoHelper
 	insertcount   int64
 	lastlogtime   time.Time
 	lastlogicount int64
@@ -78,16 +79,16 @@ func (odbci *ODBCImporter) createclass(classname, mql string) (err error) {
 		return merrs.New("len(cis) != 1")
 	}
 	oci := cis[0]
-	ci := schema.ClassInfoHelper(oci)
+	aci := ci.Schema.NewClassinfo(oci)
 	// add graph tags
-	_, e = odbci.client.Query(ci.Addtagmql, ci.Classaliasname, ci.Classaliasname, []string{ci.Classaliasname}).Do()
+	_, e = odbci.client.Query(aci.Addtagmql, aci.Classaliasname, aci.Classaliasname, []string{aci.Classaliasname}).Do()
 	if e != nil {
 		return e
 	}
-	cdi := &classdatainfo{ClassInfo: ci}
-	classdatainfos.Set(ci.Classaliasname, cdi)
-	classdatainfos.Set(ci.Classfullname, cdi)
-	logger.Info("created class", ci.Classfullname)
+	cdi := &classdatainfo{ClassInfoHelper: aci}
+	classdatainfos.Set(aci.Classaliasname, cdi)
+	classdatainfos.Set(aci.Classfullname, cdi)
+	logger.Info("created class", aci.Classfullname)
 	return
 }
 
@@ -104,17 +105,16 @@ func (odbci *ODBCImporter) createedgetype(edgetypename, mql string) (err error)
 }
 
 func (odbci *ODBCImporter) getClassinfos() (err error) {
-	schema.ClassInfos.Clear()
-	schema.ClassAliasNames = schema.ClassAliasNames[:0]
+	ci.Schema.Clear()
 	classinfos, e := odbci.client.ClassInfo("/m3cnet", true)
 	if e != nil {
 		return e
 	}
 	for _, oci := range classinfos {
-		ci := schema.ClassInfoHelper(oci)
-		cdi := &classdatainfo{ClassInfo: ci}
-		classdatainfos.Set(ci.Classaliasname, cdi)
-		classdatainfos.Set(ci.Classfullname, cdi)
+		aci := ci.Schema.NewClassinfo(oci)
+		cdi := &classdatainfo{ClassInfoHelper: aci}
+		classdatainfos.Set(aci.Classaliasname, cdi)
+		classdatainfos.Set(aci.Classfullname, cdi)
 	}
 	return nil
 }
@@ -132,10 +132,9 @@ func (odbci *ODBCImporter) init(rebuild bool) (err error) {
 		if err != nil {
 			return
 		}
-		schema.ClassInfos.Clear()
-		schema.ClassAliasNames = schema.ClassAliasNames[:0]
+		ci.Schema.Clear()
 	}
-	if schema.ClassInfos.Count() == 0 {
+	if ci.Schema.ClassCount() == 0 {
 		// 建类
 		err = odbci.ReviseClassStruct()
 		if err != nil {
@@ -147,9 +146,10 @@ func (odbci *ODBCImporter) init(rebuild bool) (err error) {
 
 func (odbci *ODBCImporter) rebuild() error {
 	if odbci.client != nil {
-		for i := len(schema.ClassAliasNames) - 1; i >= 0; i-- {
-			classaliasname := schema.ClassAliasNames[i]
-			ci := schema.ClassInfos.GetIFPresent(classaliasname)
+		classaliasnames := ci.Schema.ClassAliasNames()
+		for i := len(classaliasnames) - 1; i >= 0; i-- {
+			classaliasname := classaliasnames[i]
+			ci := ci.Schema.GetClassInfo(classaliasname)
 			if ci == nil {
 				continue
 			}
@@ -194,12 +194,7 @@ func (odbci *ODBCImporter) dropclass(classnames ...string) error {
 			}
 		}
 		logger.Info("drop class " + classname)
-		ci := schema.ClassInfos.GetIFPresent(classname)
-		if ci == nil {
-			continue
-		}
-		schema.ClassInfos.Remove(ci.Classaliasname)
-		schema.ClassInfos.Remove(ci.Classfullname)
+		ci.Schema.RemoveClassInfo(classname)
 	}
 	return nil
 }

+ 2 - 2
reader/csvreader.go

@@ -6,7 +6,7 @@ import (
 	"strconv"
 	"strings"
 
-	"git.wecise.com/wecise/cgimport/schema"
+	"git.wecise.com/wecise/odb-go/schema"
 	"github.com/spf13/cast"
 	"github.com/wecisecode/util/merrs"
 )
@@ -26,7 +26,7 @@ func NewCSVBlockReader(filename string, classname string, reader io.Reader) *CSV
 
 func (br *CSVBlockReader) ReadBlock(skiplines int) (block map[string]any, line string, linecount int, err error) {
 	classname := br.classname
-	ci := schema.ClassInfos.GetIFPresent(classname)
+	ci := schema.Schema.GetClassInfo(classname)
 	eof := false
 	for {
 		line, linecount, eof, err = br.ReadLine()

+ 0 - 165
schema/classinfo.go

@@ -1,165 +0,0 @@
-package schema
-
-import (
-	"strings"
-
-	"git.wecise.com/wecise/odb-go/schema"
-	"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
-	Fieldslist        []string
-	Keyfields         []string
-	Fieldinfos        map[string]*FieldInfo
-	DatakeyFieldinfos map[string]*FieldInfo
-	WithOptions       [][2]string
-	Insertmql         string
-	Createmql         string
-	Addtagmql         string
-}
-
-var ClassInfos = cmap.NewSingle[string, *ClassInfo]()
-var ClassAliasNames = []string{}
-
-func ClassInfoHelper(oci *schema.ClassInfo) *ClassInfo {
-	fis := []*FieldInfo{}
-	for _, fi := range oci.Fieldinfos {
-		if fi.Fieldname == "id" {
-			fis = append(fis, &FieldInfo{
-				Fieldname: "id",
-				Fieldtype: "varchar",
-				Keyidx:    0,
-				Datakey:   []string{"id"},
-			})
-		} else {
-			fis = append(fis, &FieldInfo{
-				Fieldname: fi.Fieldname,
-				Fieldtype: fi.Fieldtype,
-				Keyidx:    fi.Keyidx,
-				Datakey:   fi.NameMapping("dispname"),
-			})
-		}
-	}
-	return NewClassinfo(oci.Aliasname, oci.Shortname, oci.Basealias, fis, oci.WithOptions...)
-}
-
-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() {
-		ClassAliasNames = append(ClassAliasNames, 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 {
-				for _, dk := range bci.Fieldinfos[fi.Fieldname].Datakey {
-					if !strset.New(fi.Datakey...).Has(dk) {
-						fi.Datakey = append(fi.Datakey, dk)
-					}
-				}
-			}
-			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 {
-		if withoption[0] == "alias" {
-			continue
-		}
-		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,
-		WithOptions:       withoptions,
-		DatakeyFieldinfos: datakey_fieldinfos,
-		Keyfields:         keyfields,
-		Fieldslist:        fieldslist,
-		Insertmql:         insertmql,
-		Createmql:         createmql,
-		Addtagmql:         addtagmql,
-	}
-	return
-}