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  }