github.com/altipla-consulting/ravendb-go-client@v0.1.3/multi_type_hi_lo_id_generator.go (about) 1 package ravendb 2 3 import "sync" 4 5 // MultiTypeHiLoIDGenerator manages per-type HiLoKeyGenerator 6 type MultiTypeHiLoIDGenerator struct { 7 _generatorLock sync.Mutex // protects _idGeneratorsByTag 8 // maps type name to its generator 9 _idGeneratorsByTag map[string]*HiLoIDGenerator 10 store *DocumentStore 11 dbName string 12 conventions *DocumentConventions 13 } 14 15 // NewMultiTypeHiLoIDGenerator creates MultiTypeHiLoKeyGenerator 16 func NewMultiTypeHiLoIDGenerator(store *DocumentStore, dbName string, conventions *DocumentConventions) *MultiTypeHiLoIDGenerator { 17 return &MultiTypeHiLoIDGenerator{ 18 store: store, 19 dbName: dbName, 20 conventions: conventions, 21 _idGeneratorsByTag: map[string]*HiLoIDGenerator{}, 22 } 23 } 24 25 // GenerateDocumentID generates a unique key for entity using its type to 26 // partition keys 27 func (g *MultiTypeHiLoIDGenerator) GenerateDocumentID(entity interface{}) (string, error) { 28 typeTagName := g.conventions.getCollectionName(entity) 29 if typeTagName == "" { 30 return "", nil 31 } 32 33 tag := g.conventions.GetTransformClassCollectionNameToDocumentIdPrefix()(typeTagName) 34 35 g._generatorLock.Lock() 36 value, ok := g._idGeneratorsByTag[tag] 37 if !ok { 38 value = NewHiLoIDGenerator(tag, g.store, g.dbName, g.conventions.GetIdentityPartsSeparator()) 39 g._idGeneratorsByTag[tag] = value 40 } 41 g._generatorLock.Unlock() 42 return value.GenerateDocumentID(entity) 43 } 44 45 // ReturnUnusedRange returns unused range for all generators 46 func (g *MultiTypeHiLoIDGenerator) ReturnUnusedRange() { 47 for _, generator := range g._idGeneratorsByTag { 48 generator.ReturnUnusedRange() 49 } 50 }